[dpdk-dev] [PATCH v3 1/3] ring: read tail using atomic load
Ola Liljedahl
Ola.Liljedahl at arm.com
Sun Oct 7 22:11:08 CEST 2018
On 07/10/2018, 06:03, "Jerin Jacob" <jerin.jacob at caviumnetworks.com> wrote:
How about fixing rte_pause() then?
Meaning issuing power saving instructions on missing archs.
Rte_pause() implemented as NOP or YIELD on ARM will likely not save any power. You should use WFE for that.
I use this portable pattern:
//Wait for our turn to signal consumers (producers)
if (UNLIKELY(__atomic_load_n(loc, __ATOMIC_RELAXED) != idx))
{
SEVL();
while (WFE() && LDXR32(loc, __ATOMIC_RELAXED) != idx)
{
DOZE();
}
}
For AArch64 with WFE usage enabled:
#define SEVL() sevl()
#define WFE() wfe()
#define LDXR32(a, b) ldx32((a), (b))
#define DOZE() (void)0
static inline void sevl(void)
{
__asm__ volatile("sevl" : : : );
}
static inline int wfe(void)
{
__asm__ volatile("wfe" : : : "memory");
return 1;
}
For architectures without WFE support:
#define SEVL() (void)0
#define WFE() 1
#define LDXR32(a, b) __atomic_load_n((a), (b))
#define DOZE() doze()
static inline void doze(void)
{
__asm__ volatile("rep; nop" : : : );
}
-- Ola
More information about the dev
mailing list