From: Jiri Pirko <jiri@resnulli.us>
To: Vlad Buslov <vladbu@mellanox.com>
Cc: netdev@vger.kernel.org, davem@davemloft.net, jhs@mojatatu.com,
xiyou.wangcong@gmail.com, pablo@netfilter.org,
kadlec@blackhole.kfki.hu, fw@strlen.de, ast@kernel.org,
daniel@iogearbox.net, edumazet@google.com, keescook@chromium.org,
linux-kernel@vger.kernel.org, netfilter-devel@vger.kernel.org,
coreteam@netfilter.org, kliteyn@mellanox.com
Subject: Re: [PATCH 10/14] net: sched: extend act API for lockless actions
Date: Wed, 16 May 2018 09:50:00 +0200 [thread overview]
Message-ID: <20180516075000.GC1972@nanopsycho> (raw)
In-Reply-To: <1526308035-12484-11-git-send-email-vladbu@mellanox.com>
Mon, May 14, 2018 at 04:27:11PM CEST, vladbu@mellanox.com wrote:
>Implement new action API function to atomically delete action with
>specified index and to atomically insert unique action. These functions are
>required to implement init and delete functions for specific actions that
>do not rely on rtnl lock.
>
>Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
>---
> include/net/act_api.h | 2 ++
> net/sched/act_api.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 47 insertions(+)
>
>diff --git a/include/net/act_api.h b/include/net/act_api.h
>index a8c8570..bce0cf1 100644
>--- a/include/net/act_api.h
>+++ b/include/net/act_api.h
>@@ -153,7 +153,9 @@ int tcf_idr_create(struct tc_action_net *tn, u32 index, struct nlattr *est,
> struct tc_action **a, const struct tc_action_ops *ops,
> int bind, bool cpustats);
> void tcf_idr_insert(struct tc_action_net *tn, struct tc_action *a);
>+void tcf_idr_insert_unique(struct tc_action_net *tn, struct tc_action *a);
>
>+int tcf_idr_find_delete(struct tc_action_net *tn, u32 index);
> int __tcf_idr_release(struct tc_action *a, bool bind, bool strict);
>
> static inline int tcf_idr_release(struct tc_action *a, bool bind)
>diff --git a/net/sched/act_api.c b/net/sched/act_api.c
>index 2772276e..a5193dc 100644
>--- a/net/sched/act_api.c
>+++ b/net/sched/act_api.c
>@@ -330,6 +330,41 @@ bool tcf_idr_check(struct tc_action_net *tn, u32 index, struct tc_action **a,
> }
> EXPORT_SYMBOL(tcf_idr_check);
>
>+int tcf_idr_find_delete(struct tc_action_net *tn, u32 index)
>+{
>+ struct tcf_idrinfo *idrinfo = tn->idrinfo;
>+ struct tc_action *p;
>+ int ret = 0;
>+
>+ spin_lock_bh(&idrinfo->lock);
Why "_bh" is needed here?
>+ p = idr_find(&idrinfo->action_idr, index);
>+ if (!p) {
>+ spin_unlock(&idrinfo->lock);
>+ return -ENOENT;
>+ }
>+
>+ if (!atomic_read(&p->tcfa_bindcnt)) {
>+ if (refcount_dec_and_test(&p->tcfa_refcnt)) {
>+ struct module *owner = p->ops->owner;
>+
>+ WARN_ON(p != idr_remove(&idrinfo->action_idr,
>+ p->tcfa_index));
>+ spin_unlock_bh(&idrinfo->lock);
>+
>+ tcf_action_cleanup(p);
>+ module_put(owner);
>+ return 0;
>+ }
>+ ret = 0;
>+ } else {
>+ ret = -EPERM;
I wonder if "-EPERM" is the best error code for this...
>+ }
>+
>+ spin_unlock_bh(&idrinfo->lock);
>+ return ret;
>+}
>+EXPORT_SYMBOL(tcf_idr_find_delete);
>+
> int tcf_idr_create(struct tc_action_net *tn, u32 index, struct nlattr *est,
> struct tc_action **a, const struct tc_action_ops *ops,
> int bind, bool cpustats)
>@@ -407,6 +442,16 @@ void tcf_idr_insert(struct tc_action_net *tn, struct tc_action *a)
> }
> EXPORT_SYMBOL(tcf_idr_insert);
>
>+void tcf_idr_insert_unique(struct tc_action_net *tn, struct tc_action *a)
>+{
>+ struct tcf_idrinfo *idrinfo = tn->idrinfo;
>+
>+ spin_lock_bh(&idrinfo->lock);
>+ WARN_ON(idr_replace(&idrinfo->action_idr, a, a->tcfa_index));
Under which condition this WARN_ON is hit?
>+ spin_unlock_bh(&idrinfo->lock);
>+}
>+EXPORT_SYMBOL(tcf_idr_insert_unique);
>+
> void tcf_idrinfo_destroy(const struct tc_action_ops *ops,
> struct tcf_idrinfo *idrinfo)
> {
>--
>2.7.5
>
next prev parent reply other threads:[~2018-05-16 7:50 UTC|newest]
Thread overview: 103+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-14 14:27 [PATCH 00/14] Modify action API for implementing lockless actions Vlad Buslov
2018-05-14 14:27 ` [PATCH 01/14] net: sched: use rcu for action cookie update Vlad Buslov
2018-05-14 15:10 ` Jiri Pirko
2018-05-14 23:39 ` kbuild test robot
2018-05-14 14:27 ` [PATCH 02/14] net: sched: change type of reference and bind counters Vlad Buslov
2018-05-14 15:11 ` Jiri Pirko
2018-05-19 21:04 ` Marcelo Ricardo Leitner
2018-05-20 10:55 ` Vlad Buslov
2018-05-14 14:27 ` [PATCH 03/14] net: sched: add 'delete' function to action ops Vlad Buslov
2018-05-14 15:12 ` Jiri Pirko
2018-05-14 16:30 ` Jiri Pirko
2018-05-14 14:27 ` [PATCH 04/14] net: sched: implement unlocked action init API Vlad Buslov
2018-05-14 15:16 ` Jiri Pirko
2018-05-19 21:11 ` Marcelo Ricardo Leitner
2018-05-14 14:27 ` [PATCH 05/14] net: sched: always take reference to action Vlad Buslov
2018-05-14 16:23 ` Jiri Pirko
2018-05-14 18:49 ` Vlad Buslov
2018-05-15 8:58 ` Jiri Pirko
2018-05-15 11:52 ` Vlad Buslov
2018-05-15 1:38 ` [RFC PATCH] net: sched: __tcf_idr_check() can be static kbuild test robot
2018-05-15 1:38 ` [PATCH 05/14] net: sched: always take reference to action kbuild test robot
2018-05-14 14:27 ` [PATCH 06/14] net: sched: implement reference counted action release Vlad Buslov
2018-05-14 16:28 ` Jiri Pirko
2018-05-14 16:47 ` Jiri Pirko
2018-05-14 19:07 ` Vlad Buslov
2018-05-15 9:03 ` Jiri Pirko
2018-05-15 9:16 ` Vlad Buslov
2018-05-19 21:43 ` Marcelo Ricardo Leitner
2018-05-20 6:22 ` Jiri Pirko
2018-05-20 10:59 ` Vlad Buslov
2018-05-14 14:27 ` [PATCH 07/14] net: sched: use reference counting action init Vlad Buslov
2018-05-15 11:24 ` Jiri Pirko
2018-05-15 11:32 ` Vlad Buslov
2018-05-15 11:39 ` Jiri Pirko
2018-05-15 11:41 ` Vlad Buslov
2018-05-15 11:57 ` Jiri Pirko
2018-05-15 12:00 ` Vlad Buslov
2018-05-14 14:27 ` [PATCH 08/14] net: sched: account for temporary action reference Vlad Buslov
2018-05-16 7:12 ` Jiri Pirko
2018-05-14 14:27 ` [PATCH 09/14] net: sched: don't release reference on action overwrite Vlad Buslov
2018-05-16 7:43 ` Jiri Pirko
2018-05-16 7:47 ` Vlad Buslov
2018-05-16 7:50 ` Jiri Pirko
2018-05-19 21:52 ` Marcelo Ricardo Leitner
2018-05-20 18:42 ` Vlad Buslov
2018-05-14 14:27 ` [PATCH 10/14] net: sched: extend act API for lockless actions Vlad Buslov
2018-05-16 7:50 ` Jiri Pirko [this message]
2018-05-16 8:16 ` Vlad Buslov
2018-05-16 8:56 ` Jiri Pirko
2018-05-16 9:39 ` Vlad Buslov
2018-05-19 22:17 ` Marcelo Ricardo Leitner
2018-05-14 14:27 ` [PATCH 11/14] net: core: add new/replace rate estimator lock parameter Vlad Buslov
2018-05-16 9:54 ` Jiri Pirko
2018-05-16 10:00 ` Vlad Buslov
2018-05-16 10:11 ` Jiri Pirko
2018-05-14 14:27 ` [PATCH 12/14] net: sched: retry action check-insert on concurrent modification Vlad Buslov
2018-05-16 9:59 ` Jiri Pirko
2018-05-16 11:55 ` Vlad Buslov
2018-05-16 12:26 ` Jiri Pirko
2018-05-16 12:43 ` Vlad Buslov
2018-05-16 13:21 ` Jiri Pirko
2018-05-16 13:52 ` Vlad Buslov
2018-05-16 14:13 ` Jiri Pirko
2018-05-16 14:26 ` Vlad Buslov
2018-05-16 14:55 ` Jiri Pirko
2018-05-19 22:35 ` Marcelo Ricardo Leitner
2018-05-14 14:27 ` [PATCH 13/14] net: sched: use unique idr insert function in unlocked actions Vlad Buslov
2018-05-16 9:50 ` Jiri Pirko
2018-05-16 9:54 ` Vlad Buslov
2018-05-19 22:20 ` Marcelo Ricardo Leitner
2018-05-20 21:13 ` Or Gerlitz
2018-05-20 21:33 ` Marcelo Ricardo Leitner
2018-05-20 21:40 ` Or Gerlitz
2018-05-20 22:43 ` Marcelo Ricardo Leitner
2018-05-14 14:27 ` [PATCH 14/14] net: sched: implement delete for all actions Vlad Buslov
2018-05-16 9:48 ` Jiri Pirko
2018-05-16 9:58 ` Vlad Buslov
2018-05-19 22:45 ` Marcelo Ricardo Leitner
2018-05-14 18:03 ` [PATCH 00/14] Modify action API for implementing lockless actions Jamal Hadi Salim
2018-05-14 20:46 ` Vlad Buslov
2018-05-15 18:25 ` Jamal Hadi Salim
2018-05-15 21:21 ` Vlad Buslov
2018-05-15 21:49 ` Jamal Hadi Salim
2018-05-15 22:03 ` Lucas Bates
2018-05-15 22:07 ` Lucas Bates
2018-05-16 7:13 ` Vlad Buslov
2018-05-16 6:43 ` Vlad Buslov
2018-05-16 14:38 ` Roman Mashak
2018-05-16 15:02 ` Jamal Hadi Salim
2018-05-16 15:53 ` Vlad Buslov
2018-05-16 15:33 ` Vlad Buslov
2018-05-16 17:36 ` Roman Mashak
2018-05-16 18:10 ` Davide Caratti
2018-05-16 21:29 ` Vlad Buslov
2018-05-16 21:23 ` Vlad Buslov
2018-05-16 21:51 ` Jiri Pirko
2018-05-17 13:35 ` Vlad Buslov
2018-05-18 12:33 ` Jamal Hadi Salim
2018-05-18 16:37 ` Vlad Buslov
2018-05-15 8:20 ` Jiri Pirko
2018-05-24 23:34 ` Cong Wang
2018-05-25 20:39 ` Vlad Buslov
2018-05-25 21:40 ` Cong Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180516075000.GC1972@nanopsycho \
--to=jiri@resnulli.us \
--cc=ast@kernel.org \
--cc=coreteam@netfilter.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=fw@strlen.de \
--cc=jhs@mojatatu.com \
--cc=kadlec@blackhole.kfki.hu \
--cc=keescook@chromium.org \
--cc=kliteyn@mellanox.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=pablo@netfilter.org \
--cc=vladbu@mellanox.com \
--cc=xiyou.wangcong@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.