On 07/10/2018, 06:03, "Jerin Jacob" <jerin.ja...@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