From patchwork Tue Dec 8 15:22:01 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 553937 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 075A4140216 for ; Wed, 9 Dec 2015 02:22:15 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b=ju+h+wdG; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756824AbbLHPWJ (ORCPT ); Tue, 8 Dec 2015 10:22:09 -0500 Received: from mail-pa0-f49.google.com ([209.85.220.49]:33851 "EHLO mail-pa0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756123AbbLHPWH (ORCPT ); Tue, 8 Dec 2015 10:22:07 -0500 Received: by pacwq6 with SMTP id wq6so13436758pac.1 for ; Tue, 08 Dec 2015 07:22:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=PlMF3hI4HPR4BmgyNewGxVsNwHWZqZMGsd3azdYEnZw=; b=ju+h+wdGqjDtqdbR2IU91o7HSLNAHsJC/yqH4KhKvVKLKb3T/3Yp/hAF5Dd2I+LGAa IiyfcCPcOGJzUruuVjS/hny2pQZbWLluq9vdopETSb+hKlba7dgS5QelFd2jqRM50fmV g+jd9ICxlAD8Ztll01U2NS4dc6nSeHwuiP/8/ymqKVgFxviD5i7OWgQKMgp4VqtRnCHc ZNhL1UJaS8fKNvikdPitNd40XJWMgSpeJ2kRuv3TfpVEXaCqy7bHCz11t4iAghM2ym59 JBTvfpKW2MVfZoEq8Z45f0kkQCmWhKYSnD6qyWVS8++Stwu/kiVVnTPh920/aBf2uiEF nKiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=PlMF3hI4HPR4BmgyNewGxVsNwHWZqZMGsd3azdYEnZw=; b=cXT5TS0kb+v9G5Bg3mG0ipFvFSAdHdKaPzQSwTDxQFxHqEC6KFE5zEDYkuQrw7ro3K SJqmuxBqA5Msj8BjnaWYut17eMuiHyy8mJylOWwzd4mTgFqCokd0snAPs+b44lcZPEPR nAI93akigX6CKK6ILbqZ9YA8LAyixBEId93T7VRRrYTXZfp2ZQuGqH05lh1oYqVf81sU DsXS3IJGuZg4KImfSTkNe31JdFvRqng0lfFvJPsnIgdVPe1CgjHDrVcta9GbFwSqpzwc 8EDJkANIvK/yfNrGO9l8bdLF5F6TEI8FOXHReXJGqOSaZYOsi2wc0YmmeBHT50ujqWPx yqJQ== X-Gm-Message-State: ALoCoQkVUcyHK8P5ymA15KbRlPcKoGL8Uuc/b3OJevKmfw76ZQzi5YMgV81MB16yuhCHctpAb9Wnos7yufHsjrR3L2/tZR32bA== X-Received: by 10.67.14.104 with SMTP id ff8mr648506pad.92.1449588126746; Tue, 08 Dec 2015 07:22:06 -0800 (PST) Received: from localhost ([2620:0:1000:3002:4198:6523:6a29:5435]) by smtp.gmail.com with ESMTPSA id w85sm5479817pfa.48.2015.12.08.07.22.05 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Tue, 08 Dec 2015 07:22:05 -0800 (PST) From: Eric Dumazet To: "David S . Miller" Cc: netdev , Eric Dumazet , Steffen Klassert Subject: [PATCH net 1/2] xfrm: add rcu grace period in xfrm_policy_destroy() Date: Tue, 8 Dec 2015 07:22:01 -0800 Message-Id: <1449588122-13941-1-git-send-email-edumazet@google.com> X-Mailer: git-send-email 2.6.0.rc2.230.g3dd15c0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org We will soon switch sk->sk_policy[] to RCU protection, as SYNACK packets are sent while listener socket is not locked. This patch simply adds RCU grace period before struct xfrm_policy freeing, and the corresponding rcu_head in struct xfrm_policy. Signed-off-by: Eric Dumazet Acked-by: Steffen Klassert --- include/net/xfrm.h | 1 + net/xfrm/xfrm_policy.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 4a9c21f9b4ea..8bae1ef647cd 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -548,6 +548,7 @@ struct xfrm_policy { u16 family; struct xfrm_sec_ctx *security; struct xfrm_tmpl xfrm_vec[XFRM_MAX_DEPTH]; + struct rcu_head rcu; }; static inline struct net *xp_net(const struct xfrm_policy *xp) diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 18276f0cc32b..f57a5712cedd 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -303,6 +303,14 @@ struct xfrm_policy *xfrm_policy_alloc(struct net *net, gfp_t gfp) } EXPORT_SYMBOL(xfrm_policy_alloc); +static void xfrm_policy_destroy_rcu(struct rcu_head *head) +{ + struct xfrm_policy *policy = container_of(head, struct xfrm_policy, rcu); + + security_xfrm_policy_free(policy->security); + kfree(policy); +} + /* Destroy xfrm_policy: descendant resources must be released to this moment. */ void xfrm_policy_destroy(struct xfrm_policy *policy) @@ -312,8 +320,7 @@ void xfrm_policy_destroy(struct xfrm_policy *policy) if (del_timer(&policy->timer) || del_timer(&policy->polq.hold_timer)) BUG(); - security_xfrm_policy_free(policy->security); - kfree(policy); + call_rcu(&policy->rcu, xfrm_policy_destroy_rcu); } EXPORT_SYMBOL(xfrm_policy_destroy);