diff options
| author | Pedro Tammela <[email protected]> | 2023-12-11 18:18:07 +0000 |
|---|---|---|
| committer | Jakub Kicinski <[email protected]> | 2023-12-14 01:53:59 +0000 |
| commit | 1dd7f18fc0ed75dad4d5f2ecc84f69c6b62b6a81 (patch) | |
| tree | 3bcb7f6743ab4f3148203d01aa9bc4d02f48110a /net/sched/cls_api.c | |
| parent | net/sched: act_api: rely on rcu in tcf_idr_check_alloc (diff) | |
| download | kernel-1dd7f18fc0ed75dad4d5f2ecc84f69c6b62b6a81.tar.gz kernel-1dd7f18fc0ed75dad4d5f2ecc84f69c6b62b6a81.zip | |
net/sched: act_api: skip idr replace on bound actions
tcf_idr_insert_many will replace the allocated -EBUSY pointer in
tcf_idr_check_alloc with the real action pointer, exposing it
to all operations. This operation is only needed when the action pointer
is created (ACT_P_CREATED). For actions which are bound to (returned 0),
the pointer already resides in the idr making such operation a nop.
Even though it's a nop, it's still not a cheap operation as internally
the idr code walks the idr and then does a replace on the appropriate slot.
So if the action was bound, better skip the idr replace entirely.
Signed-off-by: Pedro Tammela <[email protected]>
Acked-by: Jamal Hadi Salim <[email protected]>
Reviewed-by: Vlad Buslov <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jakub Kicinski <[email protected]>
Diffstat (limited to 'net/sched/cls_api.c')
| -rw-r--r-- | net/sched/cls_api.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index 437daebc1fc4..dc1c19a25882 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c @@ -3313,7 +3313,7 @@ int tcf_exts_validate_ex(struct net *net, struct tcf_proto *tp, struct nlattr ** act->type = exts->type = TCA_OLD_COMPAT; exts->actions[0] = act; exts->nr_actions = 1; - tcf_idr_insert_many(exts->actions); + tcf_idr_insert_many(exts->actions, init_res); } else if (exts->action && tb[exts->action]) { int err; |
