diff options
author | Vlad Buslov <vladbu@mellanox.com> | 2018-07-05 17:24:32 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-07-08 06:42:29 +0300 |
commit | 0190c1d452a91c38a3462abdd81752be1b9006a8 (patch) | |
tree | 861605e9fbe0db5ba1ef8a518cc0bca96d04f4fb /include/net/act_api.h | |
parent | cae422f379f37fe9105d2a113259788f989e7df5 (diff) | |
download | linux-0190c1d452a91c38a3462abdd81752be1b9006a8.tar.xz |
net: sched: atomically check-allocate action
Implement function that atomically checks if action exists and either takes
reference to it, or allocates idr slot for action index to prevent
concurrent allocations of actions with same index. Use EBUSY error pointer
to indicate that idr slot is reserved.
Implement cleanup helper function that removes temporary error pointer from
idr. (in case of error between idr allocation and insertion of newly
created action to specified index)
Refactor all action init functions to insert new action to idr using this
API.
Reviewed-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/act_api.h')
-rw-r--r-- | include/net/act_api.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/include/net/act_api.h b/include/net/act_api.h index b9ed2b8256a5..8090de2edab7 100644 --- a/include/net/act_api.h +++ b/include/net/act_api.h @@ -154,6 +154,9 @@ int tcf_idr_create(struct tc_action_net *tn, u32 index, struct nlattr *est, int bind, bool cpustats); void tcf_idr_insert(struct tc_action_net *tn, struct tc_action *a); +void tcf_idr_cleanup(struct tc_action_net *tn, u32 index); +int tcf_idr_check_alloc(struct tc_action_net *tn, u32 *index, + struct tc_action **a, int bind); int tcf_idr_delete_index(struct tc_action_net *tn, u32 index); int __tcf_idr_release(struct tc_action *a, bool bind, bool strict); |