From 95bc3ed03bf192e3e62278850101fb94d46ab660 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Thu, 16 Jan 2025 14:19:25 -0500 Subject: [PATCH] ioq: Don't unroll the spin loop --- src/bfs.h | 11 +++++++++++ src/ioq.c | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/bfs.h b/src/bfs.h index af4cf9f0..6c930ad4 100644 --- a/src/bfs.h +++ b/src/bfs.h @@ -218,4 +218,15 @@ extern const char bfs_ldlibs[]; # define _target_clones(...) #endif +/** + * Optimization hint to not unroll a loop. + */ +#if __clang__ +# define _nounroll _Pragma("nounroll") +#elif __GNUC__ +# define _nounroll _Pragma("GCC unroll 0") +#else +# define _nounroll +#endif + #endif // BFS_H diff --git a/src/ioq.c b/src/ioq.c index 8050c9e9..dd5d31e4 100644 --- a/src/ioq.c +++ b/src/ioq.c @@ -277,10 +277,13 @@ static struct ioq_monitor *ioq_slot_monitor(struct ioqq *ioqq, ioq_slot *slot) { /** Atomically wait for a slot to change. */ _noinline static uintptr_t ioq_slot_wait(struct ioqq *ioqq, ioq_slot *slot, uintptr_t value) { - // Try spinning a few times before blocking uintptr_t ret; + + // Try spinning a few times before blocking + _nounroll for (int i = 0; i < 10; ++i) { // Exponential backoff + _nounroll for (int j = 0; j < (1 << i); ++j) { spin_loop(); }