bpf, arm64: use more scalable stadd over ldxr / stxr loop in xadd
commit4423a82cbde399ada728c5d027972f20d64ae4ae
authorDaniel Borkmann <daniel@iogearbox.net>
Fri, 26 Apr 2019 19:48:22 +0000 (26 21:48 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Jul 2019 11:14:49 +0000 (3 13:14 +0200)
tree850e9f0c8e8b814d6304279767aedd6cc3fe2c1c
parent436869e0cd6dd700a9d93c551d08401fd0a94d40
bpf, arm64: use more scalable stadd over ldxr / stxr loop in xadd

commit 34b8ab091f9ef57a2bb3c8c8359a0a03a8abf2f9 upstream.

Since ARMv8.1 supplement introduced LSE atomic instructions back in 2016,
lets add support for STADD and use that in favor of LDXR / STXR loop for
the XADD mapping if available. STADD is encoded as an alias for LDADD with
XZR as the destination register, therefore add LDADD to the instruction
encoder along with STADD as special case and use it in the JIT for CPUs
that advertise LSE atomics in CPUID register. If immediate offset in the
BPF XADD insn is 0, then use dst register directly instead of temporary
one.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
Acked-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/arm64/include/asm/insn.h
arch/arm64/kernel/insn.c
arch/arm64/net/bpf_jit.h
arch/arm64/net/bpf_jit_comp.c