[dpdk-dev] [RFC 1/5] eal: add the APIs to wait until equal
Stephen Hemminger
stephen at networkplumber.org
Sun Jun 30 22:27:53 CEST 2019
On Mon, 1 Jul 2019 00:21:12 +0800
Gavin Hu <gavin.hu at arm.com> wrote:
> +#ifdef RTE_USE_WFE
> +#define rte_wait_until_equal_relaxed(addr, expected) do {\
> + typeof(*addr) tmp; \
> + if (__builtin_constant_p((expected))) \
> + do { \
> + if (sizeof(*(addr)) == 16)\
> + asm volatile( \
> + "sevl\n" \
> + "1: wfe\n" \
> + "ldxrh %w0, %1\n" \
> + "cmp %w0, %w2\n" \
> + "bne 1b\n" \
> + : "=&r"(tmp) \
> + : "Q"(*addr), "i"(expected) \
> + : "cc", "memory"); \
> + else if (sizeof(*(addr)) == 32)\
> + asm volatile( \
> + "sevl\n" \
> + "1: wfe\n" \
> + "ldxr %w0, %1\n" \
> + "cmp %w0, %w2\n" \
> + "bne 1b\n" \
> + : "=&r"(tmp) \
> + : "Q"(*addr), "i"(expected) \
> + : "cc", "memory"); \
> + else if (sizeof(*(addr)) == 64)\
> + asm volatile( \
> + "sevl\n" \
> + "1: wfe\n" \
> + "ldxr %x0, %1\n" \
> + "cmp %x0, %x2\n" \
> + "bne 1b\n" \
> + : "=&r" (tmp) \
> + : "Q"(*addr), "i"(expected) \
> + : "cc", "memory"); \
> + } while (0); \
> + else \
> + do { \
> + if (sizeof(*(addr)) == 16)\
> + asm volatile( \
> + "sevl\n" \
> + "1: wfe\n" \
> + "ldxrh %w0, %1\n" \
> + "cmp %w0, %w2\n" \
> + "bne 1b\n" \
> + : "=&r"(tmp) \
> + : "Q"(*addr), "r"(expected) \
> + : "cc", "memory"); \
> + else if (sizeof(*(addr)) == 32)\
> + asm volatile( \
> + "sevl\n" \
> + "1: wfe\n" \
> + "ldxr %w0, %1\n" \
> + "cmp %w0, %w2\n" \
> + "bne 1b\n" \
> + : "=&r"(tmp) \
> + : "Q"(*addr), "r"(expected) \
> + : "cc", "memory"); \
> + else if (sizeof(*(addr)) == 64)\
> + asm volatile( \
> + "sevl\n" \
> + "1: wfe\n" \
> + "ldxr %x0, %1\n" \
> + "cmp %x0, %x2\n" \
> + "bne 1b\n" \
> + : "=&r" (tmp) \
> + : "Q"(*addr), "r"(expected) \
> + : "cc", "memory"); \
> + } while (0); \
> +} while (0)
That is a hot mess.
Macro's are harder to maintain and offer no benefit over inline functions.
More information about the dev
mailing list