From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Will Deacon <will@kernel.org>, paulmck <paulmck@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Segher Boessenkool <segher@kernel.crashing.org>,
linux-kernel <linux-kernel@vger.kernel.org>,
Alan Stern <stern@rowland.harvard.edu>,
Andrea Parri <parri.andrea@gmail.com>,
Boqun Feng <boqun.feng@gmail.com>,
Nicholas Piggin <npiggin@gmail.com>,
David Howells <dhowells@redhat.com>,
j alglave <j.alglave@ucl.ac.uk>,
luc maranget <luc.maranget@inria.fr>, akiyks <akiyks@gmail.com>,
linux-toolchains <linux-toolchains@vger.kernel.org>,
linux-arch <linux-arch@vger.kernel.org>
Subject: Re: [RFC PATCH] LKMM: Add ctrl_dep() macro for control dependency
Date: Wed, 29 Sep 2021 15:50:52 -0400 (EDT) [thread overview]
Message-ID: <457755093.44604.1632945052335.JavaMail.zimbra@efficios.com> (raw)
In-Reply-To: <CAHk-=wjd_BJiJYZ99PAoc4mQ3QTiZrt-tRdznj3g9kU8-gYsAA@mail.gmail.com>
----- On Sep 29, 2021, at 10:54 AM, Linus Torvalds torvalds@linux-foundation.org wrote:
> On Wed, Sep 29, 2021 at 7:47 AM Linus Torvalds
> <torvalds@linux-foundation.org> wrote:
>>
>> And if there *is* need ("look, we have that same store in both the if-
>> and the else-statement" or whatever), then say so, and state that
>> thing.
>
> Side note: I'd also like the commit that introduces this to talk very
> explicitly about the particular case that it is used doe and that it
> fixes. No "this can happen". A "this happened, here's the _actual_
> wrong code generation, and look how this new ctrl_dep() macro fixes
> it".
>
> When it's this subtle, I don't want theoretical arguments. I want
> actual outstanding and real bugs.
>
> Because I get the feeling that there were very few actual realistic
> examples of this, only made-up theoretical cases that wouldn't ever
> really be found in real code.
There is one particular scenario which concerns me in refcount_dec_and_test().
It relies on smp_acquire__after_ctrl_dep() to promote the control
dependency to an acquire barrier on success. Because it is exposed
within a static inline function, it hides the fact that control dependencies
are being used under the hood.
I have not identified a specific instance of oddly generated code, but this is
an accident waiting to happen. If we take this simplified refcount code
into godbolt.org and compile it for RISC-V rv64gc clang 12.0.1:
#define RISCV_FENCE(p, s) \
__asm__ __volatile__ ("fence " #p "," #s : : : "memory")
#define __smp_rmb() RISCV_FENCE(r,r)
volatile int var1;
volatile int refcount;
static inline bool refcount_dec_and_test(void)
{
refcount--;
if (refcount == 0) {
__smp_rmb(); /* acquire after ctrl_dep */
return true;
}
return false;
}
void fct(void)
{
int x;
if (refcount_dec_and_test()) {
var1 = 0;
return;
}
__smp_rmb();
var1 = 1;
}
We end up with:
fct(): # @fct()
lui a0, %hi(refcount)
lw a1, %lo(refcount)(a0)
addiw a1, a1, -1
sw a1, %lo(refcount)(a0)
lw a0, %lo(refcount)(a0)
fence r, r
snez a0, a0
lui a1, %hi(var1)
sw a0, %lo(var1)(a1)
ret
Which lacks the conditional branch, and where the "fence r,r" instruction
does not properly order following stores after the refcount load.
Adding ctrl_dep() around the refcount == 0 check fixes this:
fct(): # @fct()
lui a0, %hi(refcount)
lw a1, %lo(refcount)(a0)
addiw a1, a1, -1
sw a1, %lo(refcount)(a0)
lw a0, %lo(refcount)(a0)
beqz a0, .LBB0_2
fence r, r
addi a0, zero, 1
j .LBB0_3
.LBB0_2:
fence r, r
mv a0, zero
.LBB0_3:
lui a1, %hi(var1)
sw a0, %lo(var1)(a1)
ret
I admit that this is still a "made up" example, although it is similar to the actual
implementation of refcount_dec_and_check(). But if we need to audit every user of this
API for wrongly generated code, we may be looking for a needle in a haystack.
Thanks,
Mathieu
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
next prev parent reply other threads:[~2021-09-29 19:50 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-28 21:15 [RFC PATCH] LKMM: Add ctrl_dep() macro for control dependency Mathieu Desnoyers
2021-09-29 12:06 ` Marco Elver
2021-10-01 15:45 ` Mathieu Desnoyers
2021-10-01 16:20 ` Linus Torvalds
2021-10-01 17:28 ` Mathieu Desnoyers
2021-10-01 18:18 ` Linus Torvalds
2021-09-29 12:28 ` Florian Weimer
2021-09-29 17:41 ` Segher Boessenkool
2021-09-29 19:46 ` Florian Weimer
2021-10-01 16:13 ` Mathieu Desnoyers
2021-10-01 16:26 ` Florian Weimer
2021-10-01 16:35 ` Linus Torvalds
2021-10-10 14:02 ` Florian Weimer
2021-10-14 0:01 ` Paul E. McKenney
2021-10-14 2:14 ` Alan Stern
2021-10-14 16:14 ` Paul E. McKenney
2021-10-14 15:58 ` Florian Weimer
2021-10-14 16:23 ` Paul E. McKenney
2021-10-14 18:19 ` Florian Weimer
2021-10-14 21:09 ` Paul E. McKenney
2021-10-14 22:36 ` Linus Torvalds
2021-09-30 13:28 ` Mathieu Desnoyers
2021-09-29 14:47 ` Linus Torvalds
2021-09-29 14:54 ` Linus Torvalds
2021-09-29 19:50 ` Mathieu Desnoyers [this message]
2021-09-29 20:13 ` Mathieu Desnoyers
2021-09-29 19:27 ` Mathieu Desnoyers
2021-09-29 22:14 ` Linus Torvalds
2021-09-29 21:47 ` Segher Boessenkool
2021-09-29 23:57 ` Paul E. McKenney
2021-10-01 15:28 ` Mathieu Desnoyers
2021-10-01 22:53 ` Paul E. McKenney
2021-10-01 19:10 ` Segher Boessenkool
2021-10-01 22:50 ` Paul E. McKenney
2021-10-02 14:29 ` Alan Stern
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=457755093.44604.1632945052335.JavaMail.zimbra@efficios.com \
--to=mathieu.desnoyers@efficios.com \
--cc=akiyks@gmail.com \
--cc=boqun.feng@gmail.com \
--cc=dhowells@redhat.com \
--cc=j.alglave@ucl.ac.uk \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-toolchains@vger.kernel.org \
--cc=luc.maranget@inria.fr \
--cc=npiggin@gmail.com \
--cc=parri.andrea@gmail.com \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=segher@kernel.crashing.org \
--cc=stern@rowland.harvard.edu \
--cc=torvalds@linux-foundation.org \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).