Netdev List
 help / color / mirror / Atom feed
From: Vlad Buslov <vladbu@mellanox.com>
To: netdev@vger.kernel.org
Cc: davem@davemloft.net, jhs@mojatatu.com, xiyou.wangcong@gmail.com,
	jiri@resnulli.us, pablo@netfilter.org, kadlec@blackhole.kfki.hu,
	fw@strlen.de, ast@kernel.org, daniel@iogearbox.net,
	edumazet@google.com, keescook@chromium.org,
	marcelo.leitner@gmail.com, Vlad Buslov <vladbu@mellanox.com>
Subject: [PATCH net-next v2 02/15] net: sched: act_csum: remove dependency on rtnl lock
Date: Fri, 10 Aug 2018 20:51:42 +0300	[thread overview]
Message-ID: <1533923515-5664-3-git-send-email-vladbu@mellanox.com> (raw)
In-Reply-To: <1533923515-5664-1-git-send-email-vladbu@mellanox.com>

Use tcf lock to protect csum action struct private data from concurrent
modification in init and dump. Use rcu swap operation to reassign params
pointer under protection of tcf lock. (old params value is not used by
init, so there is no need of standalone rcu dereference step)

Remove rtnl assertion that is no longer necessary.

Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
---
 net/sched/act_csum.c | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/net/sched/act_csum.c b/net/sched/act_csum.c
index 648a3a35b720..f01c59ba6d12 100644
--- a/net/sched/act_csum.c
+++ b/net/sched/act_csum.c
@@ -50,7 +50,7 @@ static int tcf_csum_init(struct net *net, struct nlattr *nla,
 			 struct netlink_ext_ack *extack)
 {
 	struct tc_action_net *tn = net_generic(net, csum_net_id);
-	struct tcf_csum_params *params_old, *params_new;
+	struct tcf_csum_params *params_new;
 	struct nlattr *tb[TCA_CSUM_MAX + 1];
 	struct tc_csum *parm;
 	struct tcf_csum *p;
@@ -88,20 +88,22 @@ static int tcf_csum_init(struct net *net, struct nlattr *nla,
 	}
 
 	p = to_tcf_csum(*a);
-	ASSERT_RTNL();
 
 	params_new = kzalloc(sizeof(*params_new), GFP_KERNEL);
 	if (unlikely(!params_new)) {
 		tcf_idr_release(*a, bind);
 		return -ENOMEM;
 	}
-	params_old = rtnl_dereference(p->params);
+	params_new->update_flags = parm->update_flags;
 
+	spin_lock(&p->tcf_lock);
 	p->tcf_action = parm->action;
-	params_new->update_flags = parm->update_flags;
-	rcu_assign_pointer(p->params, params_new);
-	if (params_old)
-		kfree_rcu(params_old, rcu);
+	rcu_swap_protected(p->params, params_new,
+			   lockdep_is_held(&p->tcf_lock));
+	spin_unlock(&p->tcf_lock);
+
+	if (params_new)
+		kfree_rcu(params_new, rcu);
 
 	if (ret == ACT_P_CREATED)
 		tcf_idr_insert(tn, *a);
@@ -599,11 +601,13 @@ static int tcf_csum_dump(struct sk_buff *skb, struct tc_action *a, int bind,
 		.index   = p->tcf_index,
 		.refcnt  = refcount_read(&p->tcf_refcnt) - ref,
 		.bindcnt = atomic_read(&p->tcf_bindcnt) - bind,
-		.action  = p->tcf_action,
 	};
 	struct tcf_t t;
 
-	params = rtnl_dereference(p->params);
+	spin_lock(&p->tcf_lock);
+	params = rcu_dereference_protected(p->params,
+					   lockdep_is_held(&p->tcf_lock));
+	opt.action = p->tcf_action;
 	opt.update_flags = params->update_flags;
 
 	if (nla_put(skb, TCA_CSUM_PARMS, sizeof(opt), &opt))
@@ -612,10 +616,12 @@ static int tcf_csum_dump(struct sk_buff *skb, struct tc_action *a, int bind,
 	tcf_tm_dump(&t, &p->tcf_tm);
 	if (nla_put_64bit(skb, TCA_CSUM_TM, sizeof(t), &t, TCA_CSUM_PAD))
 		goto nla_put_failure;
+	spin_unlock(&p->tcf_lock);
 
 	return skb->len;
 
 nla_put_failure:
+	spin_unlock(&p->tcf_lock);
 	nlmsg_trim(skb, b);
 	return -1;
 }
-- 
2.7.5

  parent reply	other threads:[~2018-08-10 20:23 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-10 17:51 [PATCH net-next v2 00/15] Remove rtnl lock dependency from all action implementations Vlad Buslov
2018-08-10 17:51 ` [PATCH net-next v2 01/15] net: sched: act_bpf: remove dependency on rtnl lock Vlad Buslov
2018-08-10 17:51 ` Vlad Buslov [this message]
2018-08-10 17:51 ` [PATCH net-next v2 03/15] net: sched: act_gact: " Vlad Buslov
2018-08-10 17:51 ` [PATCH net-next v2 04/15] net: sched: act_ife: " Vlad Buslov
2018-08-10 17:51 ` [PATCH net-next v2 05/15] net: sched: act_ipt: " Vlad Buslov
2018-08-10 17:51 ` [PATCH net-next v2 06/15] net: sched: act_pedit: " Vlad Buslov
2018-08-10 17:51 ` [PATCH net-next v2 07/15] net: sched: act_sample: " Vlad Buslov
2018-08-10 17:51 ` [PATCH net-next v2 08/15] net: sched: act_simple: " Vlad Buslov
2018-08-10 17:51 ` [PATCH net-next v2 09/15] net: sched: act_skbmod: " Vlad Buslov
2018-08-10 17:51 ` [PATCH net-next v2 10/15] net: sched: act_tunnel_key: " Vlad Buslov
2018-08-10 17:51 ` [PATCH net-next v2 11/15] net: sched: act_vlan: " Vlad Buslov
2018-08-10 17:51 ` [PATCH net-next v2 12/15] net: sched: extend action ops with put_dev callback Vlad Buslov
2018-08-10 17:51 ` [PATCH net-next v2 13/15] net: sched: act_mirred: remove dependency on rtnl lock Vlad Buslov
2018-08-10 17:51 ` [PATCH net-next v2 14/15] net: core: protect rate estimator statistics pointer with lock Vlad Buslov
2018-08-10 17:51 ` [PATCH net-next v2 15/15] net: sched: act_police: remove dependency on rtnl lock Vlad Buslov
2018-08-11 19:38 ` [PATCH net-next v2 00/15] Remove rtnl lock dependency from all action implementations David Miller

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=1533923515-5664-3-git-send-email-vladbu@mellanox.com \
    --to=vladbu@mellanox.com \
    --cc=ast@kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=fw@strlen.de \
    --cc=jhs@mojatatu.com \
    --cc=jiri@resnulli.us \
    --cc=kadlec@blackhole.kfki.hu \
    --cc=keescook@chromium.org \
    --cc=marcelo.leitner@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=pablo@netfilter.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox