• Julian Anastasov's avatar
    ipvs: avoid rcu_barrier during netns cleanup · 9e4e948a
    Julian Anastasov authored
    commit 578bc3ef ("ipvs: reorganize dest trash") added
    rcu_barrier() on cleanup to wait dest users and schedulers
    like LBLC and LBLCR to put their last dest reference.
    Using rcu_barrier with many namespaces is problematic.
    
    Trying to fix it by freeing dest with kfree_rcu is not
    a solution, RCU callbacks can run in parallel and execution
    order is random.
    
    Fix it by creating new function ip_vs_dest_put_and_free()
    which is heavier than ip_vs_dest_put(). We will use it just
    for schedulers like LBLC, LBLCR that can delay their dest
    release.
    
    By default, dests reference is above 0 if they are present in
    service and it is 0 when deleted but still in trash list.
    Change the dest trash code to use ip_vs_dest_put_and_free(),
    so that refcnt -1 can be used for freeing. As result,
    such checks remain in slow path and the rcu_barrier() from
    netns cleanup can be removed.
    Signed-off-by: default avatarJulian Anastasov <ja@ssi.bg>
    Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
    9e4e948a
ip_vs_ctl.c 95.1 KB