Received: by 2002:a05:7412:2a8c:b0:e2:908c:2ebd with SMTP id u12csp3593663rdh; Thu, 28 Sep 2023 17:17:34 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFxkZmZkiRrAq383vm/M9Z4i726TdTMwHNr310Fth/bIRfoYte9Qlr2fBfM4WSrh9C3d0/d X-Received: by 2002:a17:902:f688:b0:1c5:ee21:ce33 with SMTP id l8-20020a170902f68800b001c5ee21ce33mr3391988plg.23.1695946653914; Thu, 28 Sep 2023 17:17:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695946653; cv=none; d=google.com; s=arc-20160816; b=EEMPJ4rlmk4VDYfr9Kiw4wQ1Ewjkh9we+ueRFfvYZFdKjO18RTmAEZk7p54g7wPN5L V0Rj9mRhtO7SH79uMP9de+u5R2PC9V0fM9EBCWdZuc2N79j9u9hdP2qxTRXcSKe7XTwK X3gzh3kymPNGoBJuAC8d3L1HMTzCG/uE8EXem0HMYEvAXYtcRM1fP6Hepo8LyoqF22VP 96u6tit/b3hA5xxdfR9bsmlYRUS67HVQ0Bw4K7SNsP5/NJcl1spXTZs+JFx9bFPJD1Ts 5n+BuAj2cvTSWumUOyDO4XPF6wKzoEWiAvRcFDJxTw7A8o1NIDT2XyKSTlkn0P1/w46B qz7g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:feedback-id:dkim-signature; bh=TGpUFaLfaaSllZ7CWKk+QI4sn9XcFVatmo3TMonjq5c=; fh=EUqIHXrcVHD6PpKqelLNh9/LX3SI+G2/8hlSlLsGRN8=; b=qUj66UjsrM4Ox8SspxioEXI5OxyQY1GHWfaF1uzmYJyqbzH3rZLPFuKPbHjeNqQYnN Smuwj8wD2ptU+OcLLKko7rXzqEaTwoYuWf+Eg16JbcdeC4e257cIInKPMss7lJ4x1CPa 7wl/jbFdlXiamc3WDP6hXhsmqPGTnneQ4lx/6MHfnVBOFau2cASBg6SlNJufC5OwTWTM ZnRqRODPNcCrXo+5dHiV8ZQheTuPZ/nJkg9RwxBQwd/y21duvCe26P7I2ymt2HaKKmvZ fN2n5R9sVHB477aLtoiE1jcE/yRE0WT/Eugj1q135yu+HkOJoAtL2LzX9L5Z1jxP8t6Q ++Ig== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=GV87FQ1W; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from lipwig.vger.email (lipwig.vger.email. [23.128.96.33]) by mx.google.com with ESMTPS id n11-20020a170902e54b00b001c5d1016b37si21131353plf.587.2023.09.28.17.17.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Sep 2023 17:17:33 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) client-ip=23.128.96.33; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=GV87FQ1W; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id DCD4E8227429; Wed, 27 Sep 2023 23:06:31 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230221AbjI1GGV (ORCPT + 99 others); Thu, 28 Sep 2023 02:06:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43140 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230150AbjI1GGT (ORCPT ); Thu, 28 Sep 2023 02:06:19 -0400 Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [IPv6:2a00:1450:4864:20::629]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F3CE199; Wed, 27 Sep 2023 23:06:17 -0700 (PDT) Received: by mail-ej1-x629.google.com with SMTP id a640c23a62f3a-9b2b53e17feso327861466b.3; Wed, 27 Sep 2023 23:06:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695881176; x=1696485976; darn=vger.kernel.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :feedback-id:from:to:cc:subject:date:message-id:reply-to; bh=TGpUFaLfaaSllZ7CWKk+QI4sn9XcFVatmo3TMonjq5c=; b=GV87FQ1W4WeoQEFKSVYqGzCohMid+jS95vtNZYrx3cmTPVU9yQDG/YDwoK+ZrQAI8z McqLoGCnPDyL3VObwbB3vkLz5rkT8giXUiOHF0eRnnNmhYx24zcHStgo6a8b1bsLPpoE 41+dEK3tIL0RTd9fRezUyiv24+OU2ToZzBaRP7CQ8xEUuSo4v611YxjF44ITDhEoDyxd JIa/7yMD+Pod09xqJuy+nbSzd4syvPkqdUl4ZlCmjpFSFOsCulEeJE7FVBuqxyvcij2f YrA6E9gSKfIr0TXENMVAVKPBqFGihJ5ak6ws3qb7+HNvyQ+dBNr2FbRkbIsOkiF/dKo3 4phg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695881176; x=1696485976; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :feedback-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=TGpUFaLfaaSllZ7CWKk+QI4sn9XcFVatmo3TMonjq5c=; b=fRrZOFXtEz0af2DAmmr439WleZDpODvhj7p4SW0ckbCGsG0w+VCBew8aIIEAv8Mtkp ry/dy4ktCRlywj3lk6Qt5m45reCvTierWeUK68SKEdpDbQZmuP7t2grOlsAtRmQNdUSa BttM/1DKamHxWU0EWSQyDIXeS4S+G3OHlbpZfSdPElpxM58LBjGroV+8a+dY7LkO/rhg hnThMtcKA32I88m7doQQAV3CMO8LsCidiNnfdk++aOO0Yuu7hWTmaBgJ3YnU6eQIMtr7 O23p0AZxAp05r+YGAnGOFDU8MhbIhJSy9GSi73PAK6i6cdcM4l43frSnD5SwhILXjG/G GvZA== X-Gm-Message-State: AOJu0YwpFctLlwmZPhiDMe44rbQx/GitNyvXypLJ9P+WdTmIiQGFCwkB ey7k5mYJ7DrdxN2Oc4wTSxGWJeB8aWE= X-Received: by 2002:a17:906:cc5a:b0:9aa:2c5b:6591 with SMTP id mm26-20020a170906cc5a00b009aa2c5b6591mr291165ejb.9.1695881176195; Wed, 27 Sep 2023 23:06:16 -0700 (PDT) Received: from auth2-smtp.messagingengine.com (auth2-smtp.messagingengine.com. [66.111.4.228]) by smtp.gmail.com with ESMTPSA id zg22-20020a170907249600b009a5f1d15642sm10256169ejb.158.2023.09.27.23.06.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Sep 2023 23:06:15 -0700 (PDT) Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailauth.nyi.internal (Postfix) with ESMTP id DB01427C0054; Thu, 28 Sep 2023 02:06:12 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute3.internal (MEProxy); Thu, 28 Sep 2023 02:06:12 -0400 X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvjedrtdehgddutdefucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepfffhvfevuffkfhggtggugfgjsehtkeertddttdejnecuhfhrohhmpeeuohhq uhhnucfhvghnghcuoegsohhquhhnrdhfvghnghesghhmrghilhdrtghomheqnecuggftrf grthhtvghrnhepvefghfeuveekudetgfevudeuudejfeeltdfhgfehgeekkeeigfdukefh gfegleefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomh epsghoqhhunhdomhgvshhmthhprghuthhhphgvrhhsohhnrghlihhthidqieelvdeghedt ieegqddujeejkeehheehvddqsghoqhhunhdrfhgvnhhgpeepghhmrghilhdrtghomhesfh higihmvgdrnhgrmhgv X-ME-Proxy: Feedback-ID: iad51458e:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 28 Sep 2023 02:06:11 -0400 (EDT) Date: Wed, 27 Sep 2023 23:06:09 -0700 From: Boqun Feng To: Sebastian Andrzej Siewior Cc: linux-kernel@vger.kernel.org, rcu@vger.kernel.org, "Paul E. McKenney" , Frederic Weisbecker , Ingo Molnar , Joel Fernandes , John Ogness , Josh Triplett , Lai Jiangshan , Mathieu Desnoyers , Neeraj Upadhyay , Peter Zijlstra , Steven Rostedt , Thomas Gleixner , Waiman Long , Will Deacon , Zqiang Subject: Re: [RFC PATCH] srcu: Use try-lock lockdep annotation for NMI-safe access. Message-ID: References: <20230927160231.XRCDDSK4@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20230927160231.XRCDDSK4@linutronix.de> X-Spam-Status: No, score=-0.6 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Wed, 27 Sep 2023 23:06:32 -0700 (PDT) On Wed, Sep 27, 2023 at 06:02:31PM +0200, Sebastian Andrzej Siewior wrote: > It is claimed that srcu_read_lock_nmisafe() NMI-safe. However it > triggers a lockdep if used from NMI because lockdep expects a deadlock > since nothing disables NMIs while the lock is acquired. > > Use a try-lock annotation for srcu_read_lock_nmisafe() to avoid lockdep > complains if used from NMI. > > Signed-off-by: Sebastian Andrzej Siewior > --- > > The splat: > | ================================ > | WARNING: inconsistent lock state > | 6.6.0-rc3-rt5+ #85 Not tainted > | -------------------------------- > | inconsistent {INITIAL USE} -> {IN-NMI} usage. > | swapper/0/0 [HC1[1]:SC0[0]:HE0:SE1] takes: > | ffffffff828e6c90 (console_srcu){....}-{0:0}, at: console_srcu_read_lock+0x3a/0x50 > | {INITIAL USE} state was registered at: > … > | CPU0 > | ---- > | lock(console_srcu); > | > | lock(console_srcu); > | > | *** DEADLOCK *** > | > > My guess is that trylock annotation should not apply to > rcu_lock_acquire(). This would distinguish it from from non-NMI safe > srcu_read_lock_nmisafe() and NMI check in rcu_read_unlock() is only > there to survive if accidentally used in-NMI. I think this is a "side-effect" of commit f0f44752f5f6 ("rcu: Annotate SRCU's update-side lockdep dependencies"). In verify_lock_unused(), i.e. the checking for NMI lock usages, the logic is that 1) read lock usages in NMI conflicts with write lock usage in normal context (i.e. LOCKF_USED) 2) write lock usage in NMI conflicts with read and write lock usage in normal context (i.e. LOCKF_USED | LOCKF_USED_READ) before that commit, only read-side of SRCU is annotated, in other words, SRCU only has read lock usage from lockdep PoV, but after that commit, we annotate synchronize_srcu() as a write lock usage, so that we can detect deadlocks between *normal* srcu_read_lock() and synchronize_srcu(), however the side effect is now SRCU has a write lock usage from lockdep PoV. Actually in the above commit, I explicitly leave srcu_read_lock_nmisafe() alone since its locking rules may be different compared to srcu_read_lock(). In lockdep terms, srcu_read_lock_nmisafe() is a !check read lock and srcu_read_lock() is a check read lock. Maybe instead of using the trylock trick, we change lockdep to igore !check locks for NMI context detection? Untested code as below: diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c index e85b5ad3e206..1af8d44e5eb4 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c @@ -5727,8 +5727,9 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass, return; if (unlikely(!lockdep_enabled())) { + /* Only do NMI context checking if it's a check lock */ /* XXX allow trylock from NMI ?!? */ - if (lockdep_nmi() && !trylock) { + if (check && lockdep_nmi() && !trylock) { struct held_lock hlock; hlock.acquire_ip = ip; Peter, thoughts? Of course, either way, we need Fixes: f0f44752f5f6 ("rcu: Annotate SRCU's update-side lockdep dependencies") Regards, Boqun > > include/linux/rcupdate.h | 6 ++++++ > include/linux/srcu.h | 2 +- > 2 files changed, 7 insertions(+), 1 deletion(-) > > diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h > index 5e5f920ade909..44aab5c0bd2c1 100644 > --- a/include/linux/rcupdate.h > +++ b/include/linux/rcupdate.h > @@ -303,6 +303,11 @@ static inline void rcu_lock_acquire(struct lockdep_map *map) > lock_acquire(map, 0, 0, 2, 0, NULL, _THIS_IP_); > } > > +static inline void rcu_try_lock_acquire(struct lockdep_map *map) > +{ > + lock_acquire(map, 0, 1, 2, 0, NULL, _THIS_IP_); > +} > + > static inline void rcu_lock_release(struct lockdep_map *map) > { > lock_release(map, _THIS_IP_); > @@ -317,6 +322,7 @@ int rcu_read_lock_any_held(void); > #else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ > > # define rcu_lock_acquire(a) do { } while (0) > +# define rcu_try_lock_acquire(a) do { } while (0) > # define rcu_lock_release(a) do { } while (0) > > static inline int rcu_read_lock_held(void) > diff --git a/include/linux/srcu.h b/include/linux/srcu.h > index 127ef3b2e6073..236610e4a8fa5 100644 > --- a/include/linux/srcu.h > +++ b/include/linux/srcu.h > @@ -229,7 +229,7 @@ static inline int srcu_read_lock_nmisafe(struct srcu_struct *ssp) __acquires(ssp > > srcu_check_nmi_safety(ssp, true); > retval = __srcu_read_lock_nmisafe(ssp); > - rcu_lock_acquire(&ssp->dep_map); > + rcu_try_lock_acquire(&ssp->dep_map); > return retval; > } > > -- > 2.40.1 >