• Florian Westphal's avatar
    netfilter: don't rely on DYING bit to detect when destroy event was sent · 616b14b4
    Florian Westphal authored
    The reliable event delivery mode currently (ab)uses the DYING bit to
    detect which entries on the dying list have to be skipped when
    re-delivering events from the eache worker in reliable event mode.
    
    Currently when we delete the conntrack from main table we only set this
    bit if we could also deliver the netlink destroy event to userspace.
    
    If we fail we move it to the dying list, the ecache worker will
    reattempt event delivery for all confirmed conntracks on the dying list
    that do not have the DYING bit set.
    
    Once timer is gone, we can no longer use if (del_timer()) to detect
    when we 'stole' the reference count owned by the timer/hash entry, so
    we need some other way to avoid racing with other cpu.
    
    Pablo suggested to add a marker in the ecache extension that skips
    entries that have been unhashed from main table but are still waiting
    for the last reference count to be dropped (e.g. because one skb waiting
    on nfqueue verdict still holds a reference).
    
    We do this by adding a tristate.
    If we fail to deliver the destroy event, make a note of this in the
    eache extension.  The worker can then skip all entries that are in
    a different state.  Either they never delivered a destroy event,
    e.g. because the netlink backend was not loaded, or redelivery took
    place already.
    
    Once the conntrack timer is removed we will now be able to replace
    del_timer() test with test_and_set_bit(DYING, &ct->status) to avoid
    racing with other cpu that tries to evict the same conntrack.
    
    Because DYING will then be set right before we report the destroy event
    we can no longer skip event reporting when dying bit is set.
    Suggested-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Acked-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    616b14b4
nf_conntrack_ecache.h 5.45 KB