Received: by 2002:a17:90a:bc8d:0:0:0:0 with SMTP id x13csp2415685pjr; Tue, 19 May 2020 14:50:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwW+A1jekY1bw0rqhe3OPEf6su2YS9Gqzi3zqxsc5pWIsRXwcC/k48FHoy4EQ9KGk3fWEvQ X-Received: by 2002:a05:6402:1558:: with SMTP id p24mr837936edx.32.1589925033468; Tue, 19 May 2020 14:50:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589925033; cv=none; d=google.com; s=arc-20160816; b=zsWKXbImugZ/fuJkI+C/oOCK833WkaowEBZlPORBOKw+2bSbWyelxsKFtzrGA0qV3i hsyUvOaXCFlMi7eutTP4wU2zO6FZP+nUGwI2dBMc/FPvn2LIz776qt8S74yN2fz6Hdwq 2owwI1uGmY3Kq/ZlQjDcJUsIVexDbKXP2OG9T6l5PsgHKxIGU/r629A4QFXcylCYPTvr 8ejlf3pLHbGLnRSkOCMYfEfUQ494b2DRwX24KgPy5BDNklPR6vW/f5Cj2e+ay5npRzhb S/t5iuFOZ458gw2QuuPe14GBweE+mCd0xV5yDyH3ttSmymrg9ZpZ59rMPUYd1Nn9c8FH KMGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=Sv3cC9sgLYicXq5eTlfO/ZtNev5btsawI1wRTavETts=; b=1FdaexskKHr+EYlvPNoDkg/sjQyM0lM448SasLGX3eCvp2iYk1S9C7yZeP51rxm6o9 3mgkt8blxn8t53v+XyICMK1Uby36ZEIxJcjHt083lOM07T8r2i+n3gyKJRpygqr2D/kb PN9OWPy4fMlWFUBpLLPNS7Y16zquIKZvwDxIwzQ5EXgBHNI2xdlz8orHE8aEvQ2O1Bh5 cA7aVBDnCO2pSQu1sWxwh66lPSVV+St0L96L2Gt6XcG+EjkKflYS/yXKu/zPjM6MBoMm +CdJGUBbS4nIfJNFCItisQQglytiehmhmoO/fsWa9xE6TPYQg8OftDyTyVlgIXLxQi6X gG/g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id r21si335151edi.133.2020.05.19.14.50.10; Tue, 19 May 2020 14:50:33 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728487AbgESVrl (ORCPT + 99 others); Tue, 19 May 2020 17:47:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40990 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728437AbgESVrj (ORCPT ); Tue, 19 May 2020 17:47:39 -0400 Received: from Galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DBA42C08C5C3; Tue, 19 May 2020 14:47:38 -0700 (PDT) Received: from [5.158.153.53] (helo=debian-buster-darwi.lab.linutronix.de.) by Galois.linutronix.de with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1jbA4w-0002oZ-PC; Tue, 19 May 2020 23:47:14 +0200 From: "Ahmed S. Darwish" To: Peter Zijlstra , Ingo Molnar , Will Deacon Cc: Thomas Gleixner , "Paul E. McKenney" , "Sebastian A. Siewior" , Steven Rostedt , LKML , "Ahmed S. Darwish" , Steffen Klassert , Herbert Xu , "David S. Miller" , Jakub Kicinski , netdev@vger.kernel.org Subject: [PATCH v1 17/25] xfrm: policy: Use sequence counters with associated lock Date: Tue, 19 May 2020 23:45:39 +0200 Message-Id: <20200519214547.352050-18-a.darwish@linutronix.de> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200519214547.352050-1-a.darwish@linutronix.de> References: <20200519214547.352050-1-a.darwish@linutronix.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A sequence counter write side critical section must be protected by some form of locking to serialize writers. If the serialization primitive is not disabling preemption implicitly, preemption has to be explicitly disabled before entering the sequence counter write side critical section. A plain seqcount_t does not contain the information of which lock must be held when entering a write side critical section. Use the new seqcount_spinlock_t and seqcount_mutex_t data types instead, which allow to associate a lock with the sequence counter. This enables lockdep to verify that the lock used for writer serialization is held when the write side critical section is entered. If lockdep is disabled this lock association is compiled out and has neither storage size nor runtime overhead. Signed-off-by: Ahmed S. Darwish --- net/xfrm/xfrm_policy.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 297b2fdb3c29..aae78a7aecd7 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -122,7 +122,7 @@ struct xfrm_pol_inexact_bin { /* list containing '*:*' policies */ struct hlist_head hhead; - seqcount_t count; + seqcount_spinlock_t count; /* tree sorted by daddr/prefix */ struct rb_root root_d; @@ -155,7 +155,7 @@ static struct xfrm_policy_afinfo const __rcu *xfrm_policy_afinfo[AF_INET6 + 1] __read_mostly; static struct kmem_cache *xfrm_dst_cache __ro_after_init; -static __read_mostly seqcount_t xfrm_policy_hash_generation; +static __read_mostly seqcount_mutex_t xfrm_policy_hash_generation; static struct rhashtable xfrm_policy_inexact_table; static const struct rhashtable_params xfrm_pol_inexact_params; @@ -719,7 +719,7 @@ xfrm_policy_inexact_alloc_bin(const struct xfrm_policy *pol, u8 dir) INIT_HLIST_HEAD(&bin->hhead); bin->root_d = RB_ROOT; bin->root_s = RB_ROOT; - seqcount_init(&bin->count); + seqcount_spinlock_init(&bin->count, &net->xfrm.xfrm_policy_lock); prev = rhashtable_lookup_get_insert_key(&xfrm_policy_inexact_table, &bin->k, &bin->head, @@ -1911,7 +1911,7 @@ static int xfrm_policy_match(const struct xfrm_policy *pol, static struct xfrm_pol_inexact_node * xfrm_policy_lookup_inexact_addr(const struct rb_root *r, - seqcount_t *count, + seqcount_spinlock_t *count, const xfrm_address_t *addr, u16 family) { const struct rb_node *parent; @@ -4158,7 +4158,7 @@ void __init xfrm_init(void) { register_pernet_subsys(&xfrm_net_ops); xfrm_dev_init(); - seqcount_init(&xfrm_policy_hash_generation); + seqcount_mutex_init(&xfrm_policy_hash_generation, &hash_resize_mutex); xfrm_input_init(); #ifdef CONFIG_INET_ESPINTCP -- 2.20.1