eal: add wrapper for C11 atomic thread fence
Provide a wrapper for __atomic_thread_fence builtins to support optimized code for __ATOMIC_SEQ_CST memory order for x86 platforms. Suggested-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com> Signed-off-by: Phil Yang <phil.yang@arm.com> Reviewed-by: Ola Liljedahl <ola.liljedahl@arm.com> Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
This commit is contained in:
parent
703a62a602
commit
672a150563
@ -37,6 +37,12 @@ extern "C" {
|
|||||||
|
|
||||||
#define rte_cio_rmb() rte_rmb()
|
#define rte_cio_rmb() rte_rmb()
|
||||||
|
|
||||||
|
static __rte_always_inline void
|
||||||
|
rte_atomic_thread_fence(int memory_order)
|
||||||
|
{
|
||||||
|
__atomic_thread_fence(memory_order);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -41,6 +41,12 @@ extern "C" {
|
|||||||
|
|
||||||
#define rte_cio_rmb() rte_rmb()
|
#define rte_cio_rmb() rte_rmb()
|
||||||
|
|
||||||
|
static __rte_always_inline void
|
||||||
|
rte_atomic_thread_fence(int memory_order)
|
||||||
|
{
|
||||||
|
__atomic_thread_fence(memory_order);
|
||||||
|
}
|
||||||
|
|
||||||
/*------------------------ 128 bit atomic operations -------------------------*/
|
/*------------------------ 128 bit atomic operations -------------------------*/
|
||||||
|
|
||||||
#if defined(__ARM_FEATURE_ATOMICS) || defined(RTE_ARM_FEATURE_ATOMICS)
|
#if defined(__ARM_FEATURE_ATOMICS) || defined(RTE_ARM_FEATURE_ATOMICS)
|
||||||
|
@ -158,6 +158,11 @@ static inline void rte_cio_rmb(void);
|
|||||||
asm volatile ("" : : : "memory"); \
|
asm volatile ("" : : : "memory"); \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Synchronization fence between threads based on the specified memory order.
|
||||||
|
*/
|
||||||
|
static inline void rte_atomic_thread_fence(int memory_order);
|
||||||
|
|
||||||
/*------------------------- 16 bit atomic operations -------------------------*/
|
/*------------------------- 16 bit atomic operations -------------------------*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -40,6 +40,12 @@ extern "C" {
|
|||||||
|
|
||||||
#define rte_cio_rmb() rte_rmb()
|
#define rte_cio_rmb() rte_rmb()
|
||||||
|
|
||||||
|
static __rte_always_inline void
|
||||||
|
rte_atomic_thread_fence(int memory_order)
|
||||||
|
{
|
||||||
|
__atomic_thread_fence(memory_order);
|
||||||
|
}
|
||||||
|
|
||||||
/*------------------------- 16 bit atomic operations -------------------------*/
|
/*------------------------- 16 bit atomic operations -------------------------*/
|
||||||
/* To be compatible with Power7, use GCC built-in functions for 16 bit
|
/* To be compatible with Power7, use GCC built-in functions for 16 bit
|
||||||
* operations */
|
* operations */
|
||||||
|
@ -83,6 +83,22 @@ rte_smp_mb(void)
|
|||||||
|
|
||||||
#define rte_cio_rmb() rte_compiler_barrier()
|
#define rte_cio_rmb() rte_compiler_barrier()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Synchronization fence between threads based on the specified memory order.
|
||||||
|
*
|
||||||
|
* On x86 the __atomic_thread_fence(__ATOMIC_SEQ_CST) generates full 'mfence'
|
||||||
|
* which is quite expensive. The optimized implementation of rte_smp_mb is
|
||||||
|
* used instead.
|
||||||
|
*/
|
||||||
|
static __rte_always_inline void
|
||||||
|
rte_atomic_thread_fence(int memory_order)
|
||||||
|
{
|
||||||
|
if (memory_order == __ATOMIC_SEQ_CST)
|
||||||
|
rte_smp_mb();
|
||||||
|
else
|
||||||
|
__atomic_thread_fence(memory_order);
|
||||||
|
}
|
||||||
|
|
||||||
/*------------------------- 16 bit atomic operations -------------------------*/
|
/*------------------------- 16 bit atomic operations -------------------------*/
|
||||||
|
|
||||||
#ifndef RTE_FORCE_INTRINSICS
|
#ifndef RTE_FORCE_INTRINSICS
|
||||||
|
Loading…
x
Reference in New Issue
Block a user