• Kuniyuki Iwashima's avatar
    af_unix: Skip GC if no cycle exists. · 77e5593a
    Kuniyuki Iwashima authored
    We do not need to run GC if there is no possible cyclic reference.
    We use unix_graph_maybe_cyclic to decide if we should run GC.
    
    If a fd of an AF_UNIX socket is passed to an already inflight AF_UNIX
    socket, they could form a cyclic reference.  Then, we set true to
    unix_graph_maybe_cyclic and later run Tarjan's algorithm to group
    them into SCC.
    
    Once we run Tarjan's algorithm, we are 100% sure whether cyclic
    references exist or not.  If there is no cycle, we set false to
    unix_graph_maybe_cyclic and can skip the entire garbage collection
    next time.
    
    When finalising SCC, we set true to unix_graph_maybe_cyclic if SCC
    consists of multiple vertices.
    
    Even if SCC is a single vertex, a cycle might exist as self-fd passing.
    Given the corner case is rare, we detect it by checking all edges of
    the vertex and set true to unix_graph_maybe_cyclic.
    
    With this change, __unix_gc() is just a spin_lock() dance in the normal
    usage.
    Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
    Acked-by: default avatarPaolo Abeni <pabeni@redhat.com>
    Link: https://lore.kernel.org/r/20240325202425.60930-11-kuniyu@amazon.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    77e5593a
garbage.c 18 KB