• Kuniyuki Iwashima's avatar
    af_unix: Assign a unique index to SCC. · bfdb0128
    Kuniyuki Iwashima authored
    The definition of the lowlink in Tarjan's algorithm is the
    smallest index of a vertex that is reachable with at most one
    back-edge in SCC.  This is not useful for a cross-edge.
    
    If we start traversing from A in the following graph, the final
    lowlink of D is 3.  The cross-edge here is one between D and C.
    
      A -> B -> D   D = (4, 3)  (index, lowlink)
      ^    |    |   C = (3, 1)
      |    V    |   B = (2, 1)
      `--- C <--'   A = (1, 1)
    
    This is because the lowlink of D is updated with the index of C.
    
    In the following patch, we detect a dead SCC by checking two
    conditions for each vertex.
    
      1) vertex has no edge directed to another SCC (no bridge)
      2) vertex's out_degree is the same as the refcount of its file
    
    If 1) is false, there is a receiver of all fds of the SCC and
    its ancestor SCC.
    
    To evaluate 1), we need to assign a unique index to each SCC and
    assign it to all vertices in the SCC.
    
    This patch changes the lowlink update logic for cross-edge so
    that in the example above, the lowlink of D is updated with the
    lowlink of C.
    
      A -> B -> D   D = (4, 1)  (index, lowlink)
      ^    |    |   C = (3, 1)
      |    V    |   B = (2, 1)
      `--- C <--'   A = (1, 1)
    
    Then, all vertices in the same SCC have the same lowlink, and we
    can quickly find the bridge connecting to different SCC if exists.
    
    However, it is no longer called lowlink, so we rename it to
    scc_index.  (It's sometimes called lowpoint.)
    
    Also, we add a global variable to hold the last index used in DFS
    so that we do not reset the initial index in each DFS.
    
    This patch can be squashed to the SCC detection patch but is
    split deliberately for anyone wondering why lowlink is not used
    as used in the original Tarjan's algorithm and many reference
    implementations.
    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-13-kuniyu@amazon.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    bfdb0128
garbage.c 18.7 KB