• Vlad Buslov's avatar
    net: sched: flower: fix filter net reference counting · 9994677c
    Vlad Buslov authored
    Fix net reference counting in fl_change() and remove redundant call to
    tcf_exts_get_net() from __fl_delete(). __fl_put() already tries to get net
    before releasing exts and deallocating a filter, so this code caused flower
    classifier to obtain net twice per filter that is being deleted.
    
    Implementation of __fl_delete() called tcf_exts_get_net() to pass its
    result as 'async' flag to fl_mask_put(). However, 'async' flag is redundant
    and only complicates fl_mask_put() implementation. This functionality seems
    to be copied from filter cleanup code, where it was added by Cong with
    following explanation:
    
        This patchset tries to fix the race between call_rcu() and
        cleanup_net() again. Without holding the netns refcnt the
        tc_action_net_exit() in netns workqueue could be called before
        filter destroy works in tc filter workqueue. This patchset
        moves the netns refcnt from tc actions to tcf_exts, without
        breaking per-netns tc actions.
    
    This doesn't apply to flower mask, which doesn't call any tc action code
    during cleanup. Simplify fl_mask_put() by removing the flag parameter and
    always use tcf_queue_work() to free mask objects.
    
    Fixes: 06177558 ("net: sched: flower: introduce reference counting for filters")
    Fixes: 1f17f774 ("net: sched: flower: insert filter to ht before offloading it to hw")
    Fixes: 05cd271f ("cls_flower: Support multiple masks per priority")
    Reported-by: default avatarIdo Schimmel <idosch@mellanox.com>
    Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9994677c
cls_flower.c 68.1 KB