diff options
author | Vlad Buslov <vladbu@mellanox.com> | 2019-08-26 16:45:01 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-08-26 14:17:43 -0700 |
commit | c9f14470d04830de217f9d28fcd0deffd7e8c0b1 (patch) | |
tree | c9872a94afc6f2b5c92c1452d8144024c25c4fec /net/sched/cls_api.c | |
parent | a449a3e77a85fc8b31fef7238451dc87af8ff1af (diff) | |
download | linux-stable-c9f14470d04830de217f9d28fcd0deffd7e8c0b1.tar.gz linux-stable-c9f14470d04830de217f9d28fcd0deffd7e8c0b1.tar.bz2 linux-stable-c9f14470d04830de217f9d28fcd0deffd7e8c0b1.zip |
net: sched: add API for registering unlocked offload block callbacks
Extend struct flow_block_offload with "unlocked_driver_cb" flag to allow
registering and unregistering block hardware offload callbacks that do not
require caller to hold rtnl lock. Extend tcf_block with additional
lockeddevcnt counter that is incremented for each non-unlocked driver
callback attached to device. This counter is necessary to conditionally
obtain rtnl lock before calling hardware callbacks in following patches.
Register mlx5 tc block offload callbacks as "unlocked".
Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/cls_api.c')
-rw-r--r-- | net/sched/cls_api.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index 8b807e75fae2..1a39779bdbad 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c @@ -1418,6 +1418,8 @@ static int tcf_block_bind(struct tcf_block *block, bo->extack); if (err) goto err_unroll; + if (!bo->unlocked_driver_cb) + block->lockeddevcnt++; i++; } @@ -1433,6 +1435,8 @@ err_unroll: block_cb->cb_priv, false, tcf_block_offload_in_use(block), NULL); + if (!bo->unlocked_driver_cb) + block->lockeddevcnt--; } flow_block_cb_free(block_cb); } @@ -1454,6 +1458,8 @@ static void tcf_block_unbind(struct tcf_block *block, NULL); list_del(&block_cb->list); flow_block_cb_free(block_cb); + if (!bo->unlocked_driver_cb) + block->lockeddevcnt--; } } |