• Cody P Schafer's avatar
    rbtree: add postorder iteration functions · 9dee5c51
    Cody P Schafer authored
    Postorder iteration yields all of a node's children prior to yielding the
    node itself, and this particular implementation also avoids examining the
    leaf links in a node after that node has been yielded.
    
    In what I expect will be its most common usage, postorder iteration allows
    the deletion of every node in an rbtree without modifying the rbtree nodes
    (no _requirement_ that they be nulled) while avoiding referencing child
    nodes after they have been "deleted" (most commonly, freed).
    
    I have only updated zswap to use this functionality at this point, but
    numerous bits of code (most notably in the filesystem drivers) use a hand
    rolled postorder iteration that NULLs child links as it traverses the
    tree.  Each of those instances could be replaced with this common
    implementation.
    
    1 & 2 add rbtree postorder iteration functions.
    3 adds testing of the iteration to the rbtree runtime tests
    4 allows building the rbtree runtime tests as builtins
    5 updates zswap.
    
    This patch:
    
    Add postorder iteration functions for rbtree.  These are useful for safely
    freeing an entire rbtree without modifying the tree at all.
    Signed-off-by: default avatarCody P Schafer <cody@linux.vnet.ibm.com>
    Reviewed-by: default avatarSeth Jennings <sjenning@linux.vnet.ibm.com>
    Cc: David Woodhouse <David.Woodhouse@intel.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Michel Lespinasse <walken@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    9dee5c51
rbtree.c 15 KB