[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20250227233652.142613-1-mjguzik@gmail.com>
Date: Fri, 28 Feb 2025 00:36:52 +0100
From: Mateusz Guzik <mjguzik@...il.com>
To: mingo@...hat.com,
peterz@...radead.org,
juri.lelli@...hat.com,
rostedt@...dmis.org
Cc: vschneid@...hat.com,
mgorman@...e.de,
bsegall@...gle.com,
dietmar.eggemann@....com,
vincent.guittot@...aro.org,
linux-kernel@...r.kernel.org,
Mateusz Guzik <mjguzik@...il.com>
Subject: [RFC PATCH] wait: avoid spurious calls to prepare_to_wait_event() in ___wait_event()
In vast majority of cases the condition determining whether the thread
can proceed is true after the first wake up.
However, even in that there is an additional call to prepare_to_wait_event(),
resulting in a spurious irq + lock trip.
Then it calls into finish_wait() to unlink itself.
pre-check the condition instead after waking up instead.
Stats gathared during a kernel build:
bpftrace -e 'kprobe:prepare_to_wait_event,kprobe:finish_wait \
{ @[probe] = count(); }'
@[kprobe:finish_wait]: 392483
@[kprobe:prepare_to_wait_event]: 778690
As in calls to prepare_to_wait_event() almost double calls to
finish_wait(). This evens out with the patch.
Signed-off-by: Mateusz Guzik <mjguzik@...il.com>
---
One may worry about using "condition" twice. However, macros leading up
to this one already do it, so it should be fine.
Also one may wonder about fences -- to my understanding going off and on
CPU guarantees a full fence.
include/linux/wait.h | 3 +++
1 file changed, 3 insertions(+)
diff --git a/include/linux/wait.h b/include/linux/wait.h
index 2bdc8f47963b..965a19809c7e 100644
--- a/include/linux/wait.h
+++ b/include/linux/wait.h
@@ -316,6 +316,9 @@ extern void init_wait_entry(struct wait_queue_entry *wq_entry, int flags);
} \
\
cmd; \
+ \
+ if (condition) \
+ break; \
} \
finish_wait(&wq_head, &__wq_entry); \
__out: __ret; \
--
2.43.0
Powered by blists - more mailing lists