projects
/
linux.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
9eae588
)
arm64: Use WFxT for __delay() when possible
author
Marc Zyngier
<maz@kernel.org>
Tue, 19 Apr 2022 18:27:55 +0000
(19:27 +0100)
committer
Marc Zyngier
<maz@kernel.org>
Wed, 20 Apr 2022 12:24:44 +0000
(13:24 +0100)
Marginally optimise __delay() by using a WFIT/WFET sequence.
It probably is a win if no interrupt fires during the delay.
Signed-off-by: Marc Zyngier <maz@kernel.org>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Link:
https://lore.kernel.org/r/20220419182755.601427-11-maz@kernel.org
arch/arm64/lib/delay.c
patch
|
blob
|
history
diff --git
a/arch/arm64/lib/delay.c
b/arch/arm64/lib/delay.c
index 1688af0a4c97fb78e1529857abd7d12759a8ea3f..5b7890139bc2f8ecef31bde2a8aa68ac4938e7e0 100644
(file)
--- a/
arch/arm64/lib/delay.c
+++ b/
arch/arm64/lib/delay.c
@@
-27,7
+27,17
@@
void __delay(unsigned long cycles)
{
cycles_t start = get_cycles();
- if (arch_timer_evtstrm_available()) {
+ if (cpus_have_const_cap(ARM64_HAS_WFXT)) {
+ u64 end = start + cycles;
+
+ /*
+ * Start with WFIT. If an interrupt makes us resume
+ * early, use a WFET loop to complete the delay.
+ */
+ wfit(end);
+ while ((get_cycles() - start) < cycles)
+ wfet(end);
+ } else if (arch_timer_evtstrm_available()) {
const cycles_t timer_evt_period =
USECS_TO_CYCLES(ARCH_TIMER_EVT_STREAM_PERIOD_US);