• Boqun Feng's avatar
    lockdep: Adjust check_redundant() for recursive read change · 68e30567
    Boqun Feng authored
    check_redundant() will report redundancy if it finds a path could
    replace the about-to-add dependency in the BFS search. With recursive
    read lock changes, we certainly need to change the match function for
    the check_redundant(), because the path needs to match not only the lock
    class but also the dependency kinds. For example, if the about-to-add
    dependency @prev -> @next is A -(SN)-> B, and we find a path A -(S*)->
    .. -(*R)->B in the dependency graph with __bfs() (for simplicity, we can
    also say we find an -(SR)-> path from A to B), we can not replace the
    dependency with that path in the BFS search. Because the -(SN)->
    dependency can make a strong path with a following -(S*)-> dependency,
    however an -(SR)-> path cannot.
    
    Further, we can replace an -(SN)-> dependency with a -(EN)-> path, that
    means if we find a path which is stronger than or equal to the
    about-to-add dependency, we can report the redundancy. By "stronger", it
    means both the start and the end of the path are not weaker than the
    start and the end of the dependency (E is "stronger" than S and N is
    "stronger" than R), so that we can replace the dependency with that
    path.
    
    To make sure we find a path whose start point is not weaker than the
    about-to-add dependency, we use a trick: the ->only_xr of the root
    (start point) of __bfs() is initialized as @prev-> == 0, therefore if
    @prev is E, __bfs() will pick only -(E*)-> for the first dependency,
    otherwise, __bfs() can pick -(E*)-> or -(S*)-> for the first dependency.
    
    To make sure we find a path whose end point is not weaker than the
    about-to-add dependency, we replace the match function for __bfs()
    check_redundant(), we check for the case that either @next is R
    (anything is not weaker than it) or the end point of the path is N
    (which is not weaker than anything).
    Signed-off-by: default avatarBoqun Feng <boqun.feng@gmail.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20200807074238.1632519-11-boqun.feng@gmail.com
    68e30567
lockdep.c 155 KB