Mon, Aug 26, 2019 at 03:44:59PM CEST, vla...@mellanox.com wrote: >Without rtnl lock protection filters can no longer safely manage block >offloads counter themselves. Refactor cls API to protect block offloadcnt >with tcf_block->cb_lock that is already used to protect driver callback >list and nooffloaddevcnt counter. The counter can be modified by concurrent >tasks by new functions that execute block callbacks (which is safe with >previous patch that changed its type to atomic_t), however, block >bind/unbind code that checks the counter value takes cb_lock in write mode >to exclude any concurrent modifications. This approach prevents race >conditions between bind/unbind and callback execution code but allows for >concurrency for tc rule update path. > >Move block offload counter, filter in hardware counter and filter flags >management from classifiers into cls hardware offloads API. Make functions >tcf_block_offload_{inc|dec}() and tc_cls_offload_cnt_update() to be cls API >private. Implement following new cls API to be used instead: > > tc_setup_cb_add() - non-destructive filter add. If filter that wasn't > already in hardware is successfully offloaded, increment block offloads > counter, set filter in hardware counter and flag. On failure, previously > offloaded filter is considered to be intact and offloads counter is not > decremented. > > tc_setup_cb_replace() - destructive filter replace. Release existing > filter block offload counter and reset its in hardware counter and flag. > Set new filter in hardware counter and flag. On failure, previously > offloaded filter is considered to be destroyed and offload counter is > decremented. > > tc_setup_cb_destroy() - filter destroy. Unconditionally decrement block > offloads counter. > > tc_setup_cb_reoffload() - reoffload filter to single cb. Execute cb() and > call tc_cls_offload_cnt_update() if cb() didn't return an error. > >Refactor all offload-capable classifiers to atomically offload filters to >hardware, change block offload counter, and set filter in hardware counter >and flag by means of the new cls API functions. > >Signed-off-by: Vlad Buslov <vla...@mellanox.com>
Acked-by: Jiri Pirko <j...@mellanox.com>