From: Cong Wang <xiyou.wangcong@gmail.com>
To: netdev@vger.kernel.org
Cc: Cong Wang <xiyou.wangcong@gmail.com>,
Lucas Bates <lucasb@mojatatu.com>,
Jamal Hadi Salim <jhs@mojatatu.com>,
Jiri Pirko <jiri@resnulli.us>
Subject: [Patch net 08/13] cls_fw: use tcf_exts_get_net() before call_rcu()
Date: Mon, 6 Nov 2017 13:47:25 -0800 [thread overview]
Message-ID: <20171106214730.24421-9-xiyou.wangcong@gmail.com> (raw)
In-Reply-To: <20171106214730.24421-1-xiyou.wangcong@gmail.com>
Hold netns refcnt before call_rcu() and release it after
the tcf_exts_destroy() is done.
Note, on ->destroy() path we have to respect the return value
of tcf_exts_get_net(), on other paths it should always return
true, so we don't need to care.
Cc: Lucas Bates <lucasb@mojatatu.com>
Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Cc: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
---
net/sched/cls_fw.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/net/sched/cls_fw.c b/net/sched/cls_fw.c
index 99183b8621ec..7f45e5ab8afc 100644
--- a/net/sched/cls_fw.c
+++ b/net/sched/cls_fw.c
@@ -122,13 +122,19 @@ static int fw_init(struct tcf_proto *tp)
return 0;
}
+static void __fw_delete_filter(struct fw_filter *f)
+{
+ tcf_exts_destroy(&f->exts);
+ tcf_exts_put_net(&f->exts);
+ kfree(f);
+}
+
static void fw_delete_filter_work(struct work_struct *work)
{
struct fw_filter *f = container_of(work, struct fw_filter, work);
rtnl_lock();
- tcf_exts_destroy(&f->exts);
- kfree(f);
+ __fw_delete_filter(f);
rtnl_unlock();
}
@@ -154,7 +160,10 @@ static void fw_destroy(struct tcf_proto *tp)
RCU_INIT_POINTER(head->ht[h],
rtnl_dereference(f->next));
tcf_unbind_filter(tp, &f->res);
- call_rcu(&f->rcu, fw_delete_filter);
+ if (tcf_exts_get_net(&f->exts))
+ call_rcu(&f->rcu, fw_delete_filter);
+ else
+ __fw_delete_filter(f);
}
}
kfree_rcu(head, rcu);
@@ -179,6 +188,7 @@ static int fw_delete(struct tcf_proto *tp, void *arg, bool *last)
if (pfp == f) {
RCU_INIT_POINTER(*fp, rtnl_dereference(f->next));
tcf_unbind_filter(tp, &f->res);
+ tcf_exts_get_net(&f->exts);
call_rcu(&f->rcu, fw_delete_filter);
ret = 0;
break;
@@ -299,6 +309,7 @@ static int fw_change(struct net *net, struct sk_buff *in_skb,
RCU_INIT_POINTER(fnew->next, rtnl_dereference(pfp->next));
rcu_assign_pointer(*fp, fnew);
tcf_unbind_filter(tp, &f->res);
+ tcf_exts_get_net(&f->exts);
call_rcu(&f->rcu, fw_delete_filter);
*arg = fnew;
--
2.13.0
next prev parent reply other threads:[~2017-11-06 21:48 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-06 21:47 [Patch net 00/13] net_sched: close the race between call_rcu() and cleanup_net() Cong Wang
2017-11-06 21:47 ` [Patch net 01/13] Revert "net_sched: hold netns refcnt for each action" Cong Wang
2017-11-06 21:47 ` [Patch net 02/13] net_sched: introduce tcf_exts_get_net() and tcf_exts_put_net() Cong Wang
2017-11-06 21:47 ` [Patch net 03/13] cls_basic: use tcf_exts_get_net() before call_rcu() Cong Wang
2017-11-06 21:47 ` [Patch net 04/13] cls_bpf: " Cong Wang
2017-11-06 21:47 ` [Patch net 05/13] cls_cgroup: " Cong Wang
2017-11-09 22:31 ` Roman Mashak
2017-11-09 23:52 ` Cong Wang
2017-11-06 21:47 ` [Patch net 06/13] cls_flow: " Cong Wang
2017-11-06 21:47 ` [Patch net 07/13] cls_flower: " Cong Wang
2017-11-06 21:47 ` Cong Wang [this message]
2017-11-06 21:47 ` [Patch net 09/13] cls_matchall: " Cong Wang
2017-11-06 21:47 ` [Patch net 10/13] cls_route: " Cong Wang
2017-11-06 21:47 ` [Patch net 11/13] cls_rsvp: " Cong Wang
2017-11-06 21:47 ` [Patch net 12/13] cls_tcindex: " Cong Wang
2017-11-06 21:47 ` [Patch net 13/13] cls_u32: " Cong Wang
2017-11-09 2:26 ` [Patch net 00/13] net_sched: close the race between call_rcu() and cleanup_net() David Miller
2017-11-09 2:32 ` 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=20171106214730.24421-9-xiyou.wangcong@gmail.com \
--to=xiyou.wangcong@gmail.com \
--cc=jhs@mojatatu.com \
--cc=jiri@resnulli.us \
--cc=lucasb@mojatatu.com \
--cc=netdev@vger.kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).