Skip to content
  • Florian Westphal's avatar
    netfilter: nf_conncount: split gc in two phases · f7fcc98d
    Florian Westphal authored
    The lockless workqueue garbage collector can race with packet path
    garbage collector to delete list nodes, as it calls tree_nodes_free()
    with the addresses of nodes that might have been free'd already from
    another cpu.
    
    To fix this, split gc into two phases.
    
    One phase to perform gc on the connections: From a locking perspective,
    this is the same as count_tree(): we hold rcu lock, but we do not
    change the tree, we only change the nodes' contents.
    
    The second phase acquires the tree lock and reaps empty nodes.
    This avoids a race condition of the garbage collection vs.  packet path:
    If a node has been free'd already, the second phase won't find it anymore.
    
    This second phase is, from locking perspective, same as insert_tree().
    
    The former only modifies nodes (list content, count), latter modifies
    the tree itself (rb_erase or rb_insert).
    
    Fixes: 5c789e13
    
     ("netfilter: nf_conncount: Add list lock and gc worker, and RCU for init tree search")
    Reviewed-by: default avatarShawn Bohrer <sbohrer@cloudflare.com>
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    f7fcc98d