From: Puranjay Mohan <puranjay@kernel.org>
To: "Ilya Leoshkevich" <iii@linux.ibm.com>,
"Alexei Starovoitov" <ast@kernel.org>,
"Daniel Borkmann" <daniel@iogearbox.net>,
"Andrii Nakryiko" <andrii@kernel.org>,
"Martin KaFai Lau" <martin.lau@linux.dev>,
"Eduard Zingerman" <eddyz87@gmail.com>,
"Song Liu" <song@kernel.org>,
"Yonghong Song" <yonghong.song@linux.dev>,
"John Fastabend" <john.fastabend@gmail.com>,
"KP Singh" <kpsingh@kernel.org>,
"Stanislav Fomichev" <sdf@google.com>,
"Hao Luo" <haoluo@google.com>, "Jiri Olsa" <jolsa@kernel.org>,
"Björn Töpel" <bjorn@kernel.org>, "Pu Lehui" <pulehui@huawei.com>,
"Paul E. McKenney" <paulmck@kernel.org>,
bpf@vger.kernel.org, "Naveen N. Rao" <naveen.n.rao@linux.ibm.com>,
"Tiezhu Yang" <yangtiezhu@loongson.cn>,
"Heiko Carstens" <hca@linux.ibm.com>
Subject: Re: [PATCH bpf] riscv, bpf: make some atomic operations fully ordered
Date: Mon, 06 May 2024 14:46:53 +0000 [thread overview]
Message-ID: <mb61pcypz0zhe.fsf@kernel.org> (raw)
In-Reply-To: <a5de8fa22c021c2df5f37f285c8d2247f1c6c1b0.camel@linux.ibm.com>
Ilya Leoshkevich <iii@linux.ibm.com> writes:
>> Puranjay Mohan <puranjay@kernel.org> writes:
>>
>> > The BPF atomic operations with the BPF_FETCH modifier along with
>> > BPF_XCHG and BPF_CMPXCHG are fully ordered but the RISC-V JIT
>> > implements
>> > all atomic operations except BPF_CMPXCHG with relaxed ordering.
>>
>> I know that the BPF memory model is in the works and we currently
>> don't
>> have a way to make all the JITs consistent. But as far as atomic
>> operations are concerned here are my observations:
>
> [...]
>
>> 4. S390
>> ----
>>
>> Ilya, can you help with this?
>>
>> I see that the kernel is emitting "bcr 14,0" after "laal|laalg" but
>> the
>> JIT is not.
>
> Hi,
>
> Here are two relevant paragraphs from the Principles of Operation:
>
> Relation between Operand Accesses
> =================================
> As observed by other CPUs and by channel pro-
> grams, storage-operand fetches associated with one
> instruction execution appear to precede all storage-
> operand references for conceptually subsequent
> instructions. A storage-operand store specified by
> one instruction appears to precede all storage-oper-
> and stores specified by conceptually subsequent
> instructions, but it does not necessarily precede stor-
> age-operand fetches specified by conceptually sub-
> sequent instructions. However, a storage-operand
> store appears to precede a conceptually subsequent
> storage-operand fetch from the same main-storage
> location.
>
> In short, all memory accesses are fully ordered except for
> stores followed by fetches from different addresses.
Thanks for sharing the details.
So, this is TSO like x86
> LAALG R1,R3,D2(B2)
> ==================
> [...]
> All accesses to the second-operand location appear
> to be a block-concurrent interlocked-update refer-
> ence as observed by other CPUs and the I/O subsys-
> tem. A specific-operand-serialization operation is
> performed.
>
> Specific-operand-serialization is weaker than full serialization,
> which means that, even though s390x provides very strong ordering
> guarantees, strictly speaking, as architected, s390x atomics are not
> fully ordered.
>
> I have a hard time thinking of a situation where a store-fetch
> reordering for different addresses could matter, but to be on the safe
> side we should probably just do what the kernel does and add a
> "bcr 14,0". I will send a patch.
Thanks,
IMO, bcr 14,0 would be needed because, s390x has both
int __atomic_add(int i, int *v);
and
int __atomic_add_barrier(int i, int *v);
both of these do the fetch operation but the second one adds a barrier
(bcr 14, 0)
JIT was using the first one (without barrier) to implement the arch_atomic_fetch_add
So, assuming that without this barrier, store->fetch reordering would be
allowed as you said.
It would mean:
This litmus test would fail for the s390 JIT:
C SB+atomic_fetch
(*
* Result: Never
*
* This litmus test demonstrates that LKMM expects total ordering from
* atomic_*() operations with fetch or return.
*)
{
atomic_t dummy1 = ATOMIC_INIT(1);
atomic_t dummy2 = ATOMIC_INIT(1);
}
P0(int *x, int *y, atomic_t *dummy1)
{
WRITE_ONCE(*x, 1);
rd = atomic_fetch_add(1, dummy1); /* assuming this is implemented without barrier */
r0 = READ_ONCE(*y);
}
P1(int *x, int *y, atomic_t *dummy2)
{
WRITE_ONCE(*y, 1);
rd = atomic_fetch_add(1, dummy2); /* assuming this is implemented without barrier */
r1 = READ_ONCE(*x);
}
exists (0:r0=0 /\ 1:r1=0)
P.S. - It would be nice to have a tool that can convert litmus tests
into BPF assembly programs and then we can test them on hardware after JITing.
Thanks,
Puranjay
next prev parent reply other threads:[~2024-05-06 14:46 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-05 20:16 [PATCH bpf] riscv, bpf: make some atomic operations fully ordered Puranjay Mohan
2024-05-05 22:40 ` Puranjay Mohan
2024-05-06 12:28 ` Ilya Leoshkevich
2024-05-06 14:46 ` Puranjay Mohan [this message]
2024-05-06 22:56 ` Ilya Leoshkevich
2024-05-07 9:52 ` Naveen N Rao
2024-05-07 17:58 ` Puranjay Mohan
2024-05-06 15:38 ` Pu Lehui
2024-05-13 0:00 ` patchwork-bot+netdevbpf
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=mb61pcypz0zhe.fsf@kernel.org \
--to=puranjay@kernel.org \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bjorn@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=haoluo@google.com \
--cc=hca@linux.ibm.com \
--cc=iii@linux.ibm.com \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=kpsingh@kernel.org \
--cc=martin.lau@linux.dev \
--cc=naveen.n.rao@linux.ibm.com \
--cc=paulmck@kernel.org \
--cc=pulehui@huawei.com \
--cc=sdf@google.com \
--cc=song@kernel.org \
--cc=yangtiezhu@loongson.cn \
--cc=yonghong.song@linux.dev \
/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