From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 33C26CF6498 for ; Sun, 29 Sep 2024 15:51:20 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id BA0F16B01F0; Sun, 29 Sep 2024 11:51:19 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B27BD6B01F2; Sun, 29 Sep 2024 11:51:19 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 97B5F6B01F4; Sun, 29 Sep 2024 11:51:19 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 73CAC6B01F0 for ; Sun, 29 Sep 2024 11:51:19 -0400 (EDT) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 15428C0EA4 for ; Sun, 29 Sep 2024 15:51:19 +0000 (UTC) X-FDA: 82618215078.12.94DE821 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf29.hostedemail.com (Postfix) with ESMTP id 5B77E120003 for ; Sun, 29 Sep 2024 15:51:16 +0000 (UTC) Authentication-Results: imf29.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=s+tU+dSW; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf29.hostedemail.com: domain of "SRS0=+mCV=Q3=paulmck-ThinkPad-P17-Gen-1.home=paulmck@kernel.org" designates 139.178.84.217 as permitted sender) smtp.mailfrom="SRS0=+mCV=Q3=paulmck-ThinkPad-P17-Gen-1.home=paulmck@kernel.org" ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1727625038; a=rsa-sha256; cv=none; b=R4lBJW2/aDOOxCVyJZGHdCJcuAQEkfDwcZvMFB98DO/YeNAdthKCqdDFEoKY0SYKpgntlX 2NNswCIzedaqHbYziPbh3lSbXfb4AWj2AMjei3T4aFvi3ov+evud1ZurdbODDSQ2U0EABr I7p2xB1kRwUX54KiqwNoBvA2lKngxdg= ARC-Authentication-Results: i=1; imf29.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=s+tU+dSW; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf29.hostedemail.com: domain of "SRS0=+mCV=Q3=paulmck-ThinkPad-P17-Gen-1.home=paulmck@kernel.org" designates 139.178.84.217 as permitted sender) smtp.mailfrom="SRS0=+mCV=Q3=paulmck-ThinkPad-P17-Gen-1.home=paulmck@kernel.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1727625038; h=from:from:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=6EnQk+5MmVk4JNYZqUy3141hKKtrM3ZXWe8aNNciZNk=; b=HnC3nBYrdfRmYvicJ3DPFj08V6zGO32zymaR27xwyp3MgawQvdmXtCUN7Yc+K9BBBPsQc0 MdMpzjxHuah/sO4e5jWio5/R3kca1RBcTNTTnB9AKrLRnXoXVKUAZkectizHL2VtNE8rr6 JNZObvstlEG4t/qVYXVrOqi6fUy4nqs= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 0FE375C3A78; Sun, 29 Sep 2024 15:51:11 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B4607C4CEC6; Sun, 29 Sep 2024 15:51:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1727625074; bh=KT0NvVFCww9jUSGdpuipSki65RESc4oWk+fSOgC7mFk=; h=Date:From:To:Cc:Subject:Reply-To:References:In-Reply-To:From; b=s+tU+dSWCQMuFEMfAoj6SdGdq6uzxmIB+i1vYvyJ/mgQM9ht7+PRH6/S6Et4B52lm UzZOb1yYNiti2lZuGXB+Wv3XfqJ6shFc6gLasSBrA12nNupa7OqO9AnLHdfzldcI3N Q2830MNNQqSD3EoiQJvUeNbtiCxCSWkeG8dcMe7gawztSDm1MMB9wGhr620n9eULbt 6bAVsPM9txJJLrJ4E7SWRcRaRuku7+2Ri7MyG7wQF+tKyiw+yhAwWvAWiWpzwAlatp BPRlhX48gCpJYn9LzTD2h7lzLLH4MXvj1pR+GHJDCGqAzSmOfqFillipjwqriWwgcT /tnmwtUVctdEQ== Received: by paulmck-ThinkPad-P17-Gen-1.home (Postfix, from userid 1000) id 60CE5CE04D4; Sun, 29 Sep 2024 08:51:14 -0700 (PDT) Date: Sun, 29 Sep 2024 08:51:14 -0700 From: "Paul E. McKenney" To: Mathieu Desnoyers Cc: Linus Torvalds , linux-kernel@vger.kernel.org, Greg Kroah-Hartman , Sebastian Andrzej Siewior , Will Deacon , Peter Zijlstra , Boqun Feng , Alan Stern , John Stultz , Neeraj Upadhyay , Frederic Weisbecker , Joel Fernandes , Josh Triplett , Uladzislau Rezki , Steven Rostedt , Lai Jiangshan , Zqiang , Ingo Molnar , Waiman Long , Mark Rutland , Thomas Gleixner , Vlastimil Babka , maged.michael@gmail.com, Mateusz Guzik , Gary Guo , Jonas Oberhauser , rcu@vger.kernel.org, linux-mm@kvack.org, lkmm@lists.linux.dev, Nikita Popov , llvm@lists.linux.dev Subject: Re: [PATCH v1 2/2] Documentation: RCU: Refer to ptr_eq() Message-ID: <8153f0f1-fd18-4ae1-9dc5-f9b725429cad@paulmck-laptop> Reply-To: paulmck@kernel.org References: <20240929111608.1016757-1-mathieu.desnoyers@efficios.com> <20240929111608.1016757-3-mathieu.desnoyers@efficios.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20240929111608.1016757-3-mathieu.desnoyers@efficios.com> X-Rspam-User: X-Rspamd-Queue-Id: 5B77E120003 X-Rspamd-Server: rspam01 X-Stat-Signature: xjujzddxxdu6pjmcmasj4y5k4irmiuim X-HE-Tag: 1727625076-66053 X-HE-Meta: U2FsdGVkX18Z1h4nJTxT3Bk8NmwMibdnlvntRwNmJNF/kmSg0hPDMQoQfOwigFLPms+tKa7UK5eg2TTsUYS7C+PINUlp9E7kl7iKe5BqXxtdz5IuPoJf9fgdKyjs/dDcPlM/YhuSEAZhGIKtLgEG+6KUSZ1PjzeB0fWLM8w1BcVP39htUw6k3JRmPFU8/f8ZTKxnk6VniiRVL8e+1h609DFb2vtDpoBoE4jwqti7dj1r2ONnIuzaEee58nkTa78fMB6evAMF3gqoso5RfXY2neadEGf0nxYAOrirXfsfDXKIwDjq6Hqq59mV6WE5Jbv7kG5v7krtr/ajt1MHISdwZZuz2L/is7f1AEpz1lx1mmO2JA45N9uNl4w0s45aioMCHye/6EW36TIkgGOVpqPdf9L4VEVIhcqu5vaeLyIuooKmwKeOV39b1nqlkpZiRQrckQjtJuOfAqoHtq49pMXfclQ1hFlGKepVUdASSZfzR9YxMgOMHtyifocME0kiI1HQb8lYGPZh2VpmhxgKyohnkYqQssdjiASH8iQV9+CzGzvVj9A53RTUHURvkA2a/C+CyX0M5Km0+/7fyyilgGtXrvY0/SANW7aWGBVIEj/VxdZF2q+uT8Kk95ZjRWU76jiEWRzx4Ts2Em1gdExA4qsASRus++cLGInF42xePHCM+uWo1bHSdRVVrxfqkf7XTjOlmuss7psAiDlY3rtjnSGZoJzRsVQfWbOnRA87HfI+IhgdEreZYjCHvGihpEiR9O4r6p6bkF9CvYWgDN28OnuSzTHgqIt/5vNW4jKkH40EMM1lO3bw2Ok6ZgONXmJzXnuhXN78W1XnRa0LaC9dO0bfo5N/oe951m+3+oUDGmXetvBBKCWQIcqWMn7+7CSDj4lBo9mXnN995Y0Vk5nOTr7GwfLG5XrtdxK2hq4RF7kFf91FwTHHvWvToQMD+d/nDyuw9P6jeL1s4Ai+QOzxJre wyhBVKvU VExEroRtQZ5qmTQABxBtECYRtX/5EU+iAV/SSF9iUEHrvSqhNPQGDTY6NJlDTgVuLZqbld9yczJSQ+MwElxy3BQWbx/vX/0KlDbYkPiC0UtrpLanKzQwg17FGY1uYYtzEHsHD8on4zY7H5/HAQM8VMiTvjiHPK9Be/zrioktHXS1mxcWJFyxAodgLJJRjiA3DmsTIA0jCEzxu8jh7eYvB+VGDhe2YQtgXTGMc05F1s5BZ395k0H3sOGR2/eL0G6SMyrwwaYdPNdl9UJ2LjyaHwhhXqE7GKmeoPaDIQoREDBV/Mz9n/hDfwWdVD6Qui/AgJ8nrM1qfafQOfO21NybcN5SOiRfutazABpr8U5AMl/M6nrJ1PT9bj7po7SNWeVDB8UQmQFFGNRHCR8cZk/h6WOIxU5jwB0bLo8jW8uXh/ekobTpPYIP3HRrtOyAGEVbG8U7F0yvfCfanu9kxJvnWOqckUD12YfsoTRNXhl5FxO44e6fFb8qSiuCiRUSlZ2GpIFRfJah87IRLQfh93/VwYEO5SsBKd/N11LocOu90DcAPqA4DhwhbvYj5qdfbvfmuBSIVWLpJnckbWDBmpKwDC4w3rwq+RgkYtrXeynTjev2mkVrT7qPylRbBUNMSKvUqEeCuQIcdZh3z0JWXKScMj1zUm0f6Ig4hixaZmXy0u+GYWtfpS11M4bfYRbgVJH/QWu28Lhe1FeipRloazIKmSAMOYXX+J7VcmXt/Mj+zpNjWQ+WVE9Ko8D6K3TfqdD4fS0rWyf9OLyOW825DOfhtT5BARYZ3DELW4HFLhMaxJ7r5KJM6ShK8yDmB3BF9fWwxXcgf5hEoHpDHbhImb0RXtZJ2Nk3Qg19T8MdFeUqoYwXL1sLZvwwpQ/uYUFZFoCwx6CQclMSNnrnahMm1ijojbFpsXoNY5M65BBzjoDj3uHXGNnA6kWBT2bwwmKSZ95tq4o7O2ap+NilRc+NlDepOh8x8YoMp QxWM9Gxz CscETJBbXKa2mmxn2gSiwEgbFvUsK04eEcxo40KkDxVlhX8YXxhvk713kmxE5KCzMmNkJrPlpFtyqrbKxoavWjZ7A4FBv5fjg+m2JARueNII9HDfk5ibxTY7Q1sjv4hsbQnd+1WT/6AvvtHchSCpG0+3QGuC/Ydmnba2KuaOc60OE2kJL25Gdh8mgq6QI/0zIo1+tWMFAXZKPYUT6zuZVZIN/uYxBf14jCQHfyN/UxcoOWFSo/pPtTyut08QA6SOgj5PGPRvJ+G26uUw7mfHiCph/dvhXZU6354bb068Pk91hma+A1avq1crfhOZi6SZOc7Taq3y+tEYq9kxBqz5boH3N4C9qLe0wrx7kjUEgfOTFB7Y3wsZ+Wx//EMrm6JVNIr6qlJRSDo8QzKilwWWbGpOF5mTTLtIeF1Ob6SnOvm0/ywnlKIDJa2z7eYkM0CUullaCcNejad2eOU2Q8d6phNsYy4do3YZL/6ylGKN3TTL59QCSoubmTahJj1cUVuF X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Sun, Sep 29, 2024 at 07:16:08AM -0400, Mathieu Desnoyers wrote: > Refer to ptr_eq() in the rcu_dereference() documentation. > > ptr_eq() is a mechanism that preserves address dependencies when > comparing pointers, and should be favored when comparing a pointer > obtained from rcu_dereference() against another pointer. > > Signed-off-by: Mathieu Desnoyers > Cc: Greg Kroah-Hartman > Cc: Sebastian Andrzej Siewior > Cc: "Paul E. McKenney" > Cc: Will Deacon > Cc: Peter Zijlstra > Cc: Boqun Feng > Cc: Alan Stern > Cc: John Stultz > Cc: Neeraj Upadhyay > Cc: Linus Torvalds > Cc: Boqun Feng > Cc: Frederic Weisbecker > Cc: Joel Fernandes > Cc: Josh Triplett > Cc: Uladzislau Rezki > Cc: Steven Rostedt > Cc: Lai Jiangshan > Cc: Zqiang > Cc: Ingo Molnar > Cc: Waiman Long > Cc: Mark Rutland > Cc: Thomas Gleixner > Cc: Vlastimil Babka > Cc: maged.michael@gmail.com > Cc: Mateusz Guzik > Cc: Gary Guo > Cc: Jonas Oberhauser > Cc: rcu@vger.kernel.org > Cc: linux-mm@kvack.org > Cc: lkmm@lists.linux.dev > Cc: Nikita Popov > Cc: llvm@lists.linux.dev > --- > Changes since v0: > - Include feedback from Alan Stern. > --- > Documentation/RCU/rcu_dereference.rst | 32 ++++++++++++++++++++++----- > 1 file changed, 27 insertions(+), 5 deletions(-) > > diff --git a/Documentation/RCU/rcu_dereference.rst b/Documentation/RCU/rcu_dereference.rst > index 2524dcdadde2..9ef97b7ca74d 100644 > --- a/Documentation/RCU/rcu_dereference.rst > +++ b/Documentation/RCU/rcu_dereference.rst > @@ -104,11 +104,12 @@ readers working properly: > after such branches, but can speculate loads, which can again > result in misordering bugs. > > -- Be very careful about comparing pointers obtained from > - rcu_dereference() against non-NULL values. As Linus Torvalds > - explained, if the two pointers are equal, the compiler could > - substitute the pointer you are comparing against for the pointer > - obtained from rcu_dereference(). For example:: > +- Use operations that preserve address dependencies (such as > + "ptr_eq()") to compare pointers obtained from rcu_dereference() > + against non-NULL pointers. As Linus Torvalds explained, if the > + two pointers are equal, the compiler could substitute the > + pointer you are comparing against for the pointer obtained from > + rcu_dereference(). For example:: > > p = rcu_dereference(gp); > if (p == &default_struct) > @@ -125,6 +126,23 @@ readers working properly: > On ARM and Power hardware, the load from "default_struct.a" > can now be speculated, such that it might happen before the > rcu_dereference(). This could result in bugs due to misordering. > + Performing the comparison with "ptr_eq()" ensures the compiler > + does not perform such transformation. > + > + If the comparison is against another pointer, the compiler is > + allowed to use either pointer for the following accesses, which > + loses the address dependency and allows weakly-ordered > + architectures such as ARM and PowerPC to speculate the > + address-dependent load before rcu_dereference(). For example:: > + > + p1 = READ_ONCE(gp); > + p2 = rcu_dereference(gp); > + if (p1 == p2) > + do_default(p2->a); > + > + The compiler can use p1->a rather than p2->a, destroying the > + address dependency. Performing the comparison with "ptr_eq()" > + ensures the compiler preserves the address dependencies. Bitter experience leads me to suggest a "// BUGGY" comment on the "if" statement in the above example, and a corrected code snippet right here. :-/ Other than that, loks good! Thanx, Paul > However, comparisons are OK in the following cases: > > @@ -204,6 +222,10 @@ readers working properly: > comparison will provide exactly the information that the > compiler needs to deduce the value of the pointer. > > + When in doubt, use operations that preserve address dependencies > + (such as "ptr_eq()") to compare pointers obtained from > + rcu_dereference() against non-NULL pointers. > + > - Disable any value-speculation optimizations that your compiler > might provide, especially if you are making use of feedback-based > optimizations that take data collected from prior runs. Such > -- > 2.39.2 >