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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.