]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
arm64: Use WFxT for __delay() when possible
authorMarc Zyngier <maz@kernel.org>
Tue, 19 Apr 2022 18:27:55 +0000 (19:27 +0100)
committerMarc 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

index 1688af0a4c97fb78e1529857abd7d12759a8ea3f..5b7890139bc2f8ecef31bde2a8aa68ac4938e7e0 100644 (file)
@@ -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);