eal/arm64: add 128-bit atomic compare exchange
authorPhil Yang <phil.yang@arm.com>
Fri, 18 Oct 2019 11:21:28 +0000 (19:21 +0800)
committerDavid Marchand <david.marchand@redhat.com>
Mon, 21 Oct 2019 08:06:13 +0000 (10:06 +0200)
commit7e2c3e17fe2cf6e7110261ff16280ab51ca6493c
treeafb9af211f967839e97a8b9176f9decfe9d81a8f
parentb30b134f82a19096fa096cf9bfa9822bec2e6c49
eal/arm64: add 128-bit atomic compare exchange

This patch adds the implementation of the 128-bit atomic compare
exchange API on aarch64. Using 64-bit 'ldxp/stxp' instructions
can perform this operation. Moreover, on the LSE atomic extension
accelerated platforms, it is implemented by 'casp' instructions for
better performance.

Since the '__ARM_FEATURE_ATOMICS' flag only supports GCC-9, this
patch adds a new config flag 'RTE_ARM_FEATURE_ATOMICS' to enable
the 'cas' version on older version compilers.
For octeontx2, we make sure that the lse (and other) extensions are
enabled even if the compiler does not know of the octeontx2 target
cpu.

Since direct x0 register used in the code and cas_op_name() and
rte_atomic128_cmp_exchange() is inline function, based on parent
function load, it may corrupt x0 register aka break aarch64 ABI.
Define CAS operations as rte_noinline functions to avoid an ABI
break [1].

1: https://git.dpdk.org/dpdk/commit/?id=5b40ec6b9662

Suggested-by: Jerin Jacob <jerinj@marvell.com>
Signed-off-by: Phil Yang <phil.yang@arm.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Tested-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
Reviewed-by: David Marchand <david.marchand@redhat.com>
config/arm/meson.build
config/common_base
config/defconfig_arm64-octeontx2-linuxapp-gcc
config/defconfig_arm64-thunderx2-linuxapp-gcc
lib/librte_eal/common/include/arch/arm/rte_atomic_64.h
lib/librte_eal/common/include/arch/x86/rte_atomic_64.h
lib/librte_eal/common/include/generic/rte_atomic.h