Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp4429541imm; Mon, 14 May 2018 07:28:18 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrFEjrbo5wq9MHGpqtNt7g4rsRMXZUwczdWTrPlDcXT7hvPgKMF5Ahc42rC4Nl6/g7vWmK8 X-Received: by 2002:a62:5d4a:: with SMTP id r71-v6mr10671934pfb.147.1526308098101; Mon, 14 May 2018 07:28:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526308098; cv=none; d=google.com; s=arc-20160816; b=WxGS6JWNkHb2ztMcOcE/RGeOUs9Pdachuh3JzdSkeNPbe+487Bu0KLpaaTjWiy5Vae wFChOcysRSWFNK0Gfu50cPlrLazougMJ5uzG/WXIFjGjzsZQNxj1Ep98NY7b5aMqgKu3 NhA+gKnbOqdOLO2cqmp265pSNG2O1QCmUgms8U65Cy/vytByJxtR5TFOuQFjEzhKa0oQ cIxaWLziMqdxaK283xJLAeSUFQyWWXbnbi6NRgNyVq1g2mCGB/Cvj0gAZ2t9ClvIEpge MUcDvfoRc/MSF8T5VBwYnrlUzZcQZeD32574I01YnerI8VcDefiisLUSNErW5dN51NkU uj1g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=HadPt7zc89tqdGqTyyFZrn/3cMf4MUnZgc07nUU0LLs=; b=CrugVMQv0kz7EEMo3U4toLdnJJ+oAtPoC3zfnSIEfpIwce+lBjdJigM0B5TczgCTHm qul0IknEONz7M34M7EELTpzDwbDSuTZSxF4VpCkzyd4U1Yk8r/Cx3Lp5v0LclLVJ7Ly+ zfJ7s+4Ixb0RnAbvayDSk9sq0vAu+QiUESIAvo5ESZfyRj1NCXTNeYtF6yM0TsP1rNZp xXYkIP7CBgfMnfVK/T1y2BqIuB+Ww2gdtn8llgIyFG9k5X7vDXNCKshpTxv4pDuRqiDC RZXHsfE2HW3zCYVFZErcqGrUZbYY/QzOc/xrA+kkLoLuH2VrhWVq1mdUxUd8kuGac8lb Ao4A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mellanox.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z9-v6si10293776plk.94.2018.05.14.07.28.03; Mon, 14 May 2018 07:28:18 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mellanox.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754008AbeENO1p (ORCPT + 99 others); Mon, 14 May 2018 10:27:45 -0400 Received: from mail-il-dmz.mellanox.com ([193.47.165.129]:35036 "EHLO mellanox.co.il" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752539AbeENO1l (ORCPT ); Mon, 14 May 2018 10:27:41 -0400 Received: from Internal Mail-Server by MTLPINE1 (envelope-from vladbu@mellanox.com) with ESMTPS (AES256-SHA encrypted); 14 May 2018 17:29:22 +0300 Received: from reg-r-vrt-018-180.mtr.labs.mlnx (reg-r-vrt-018-180.mtr.labs.mlnx [10.213.18.180]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id w4EERXLT002750; Mon, 14 May 2018 17:27:34 +0300 From: Vlad Buslov 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, vladbu@mellanox.com, keescook@chromium.org, linux-kernel@vger.kernel.org, netfilter-devel@vger.kernel.org, coreteam@netfilter.org, kliteyn@mellanox.com Subject: [PATCH 01/14] net: sched: use rcu for action cookie update Date: Mon, 14 May 2018 17:27:02 +0300 Message-Id: <1526308035-12484-2-git-send-email-vladbu@mellanox.com> X-Mailer: git-send-email 2.7.5 In-Reply-To: <1526308035-12484-1-git-send-email-vladbu@mellanox.com> References: <1526308035-12484-1-git-send-email-vladbu@mellanox.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Implement functions to atomically update and free action cookie using rcu mechanism. Signed-off-by: Vlad Buslov --- include/net/act_api.h | 2 +- include/net/pkt_cls.h | 1 + net/sched/act_api.c | 44 ++++++++++++++++++++++++++++++-------------- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/include/net/act_api.h b/include/net/act_api.h index 9e59ebf..f7b59ef 100644 --- a/include/net/act_api.h +++ b/include/net/act_api.h @@ -37,7 +37,7 @@ struct tc_action { spinlock_t tcfa_lock; struct gnet_stats_basic_cpu __percpu *cpu_bstats; struct gnet_stats_queue __percpu *cpu_qstats; - struct tc_cookie *act_cookie; + struct tc_cookie __rcu *act_cookie; struct tcf_chain *goto_chain; }; #define tcf_index common.tcfa_index diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h index e828d31..3068cc8 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h @@ -769,6 +769,7 @@ struct tc_mqprio_qopt_offload { struct tc_cookie { u8 *data; u32 len; + struct rcu_head rcu; }; struct tc_qopt_offload_stats { diff --git a/net/sched/act_api.c b/net/sched/act_api.c index 72251241..ce829a3 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c @@ -55,6 +55,24 @@ static void tcf_action_goto_chain_exec(const struct tc_action *a, res->goto_tp = rcu_dereference_bh(chain->filter_chain); } +static void tcf_free_cookie_rcu(struct rcu_head *p) +{ + struct tc_cookie *cookie = container_of(p, struct tc_cookie, rcu); + + kfree(cookie->data); + kfree(cookie); +} + +static void tcf_set_action_cookie(struct tc_cookie __rcu **old_cookie, + struct tc_cookie *new_cookie) +{ + struct tc_cookie *old; + + old = xchg(old_cookie, new_cookie); + if (old) + call_rcu(&old->rcu, tcf_free_cookie_rcu); +} + /* XXX: For standalone actions, we don't need a RCU grace period either, because * actions are always connected to filters and filters are already destroyed in * RCU callbacks, so after a RCU grace period actions are already disconnected @@ -65,10 +83,7 @@ static void free_tcf(struct tc_action *p) free_percpu(p->cpu_bstats); free_percpu(p->cpu_qstats); - if (p->act_cookie) { - kfree(p->act_cookie->data); - kfree(p->act_cookie); - } + tcf_set_action_cookie(&p->act_cookie, NULL); if (p->goto_chain) tcf_action_goto_chain_fini(p); @@ -567,16 +582,22 @@ tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int bind, int ref) int err = -EINVAL; unsigned char *b = skb_tail_pointer(skb); struct nlattr *nest; + struct tc_cookie *cookie; if (nla_put_string(skb, TCA_KIND, a->ops->kind)) goto nla_put_failure; if (tcf_action_copy_stats(skb, a, 0)) goto nla_put_failure; - if (a->act_cookie) { - if (nla_put(skb, TCA_ACT_COOKIE, a->act_cookie->len, - a->act_cookie->data)) + + rcu_read_lock(); + cookie = rcu_dereference(a->act_cookie); + if (cookie) { + if (nla_put(skb, TCA_ACT_COOKIE, cookie->len, cookie->data)) { + rcu_read_unlock(); goto nla_put_failure; + } } + rcu_read_unlock(); nest = nla_nest_start(skb, TCA_OPTIONS); if (nest == NULL) @@ -719,13 +740,8 @@ struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp, if (err < 0) goto err_mod; - if (name == NULL && tb[TCA_ACT_COOKIE]) { - if (a->act_cookie) { - kfree(a->act_cookie->data); - kfree(a->act_cookie); - } - a->act_cookie = cookie; - } + if (!name && tb[TCA_ACT_COOKIE]) + tcf_set_action_cookie(&a->act_cookie, cookie); /* module count goes up only when brand new policy is created * if it exists and is only bound to in a_o->init() then -- 2.7.5