mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 19:43:40 +02:00
arm64: Use WFxT for __delay() when possible
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
This commit is contained in:
parent
9eae588529
commit
7d26b0516a
|
|
@ -27,7 +27,17 @@ void __delay(unsigned long cycles)
|
||||||
{
|
{
|
||||||
cycles_t start = get_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 =
|
const cycles_t timer_evt_period =
|
||||||
USECS_TO_CYCLES(ARCH_TIMER_EVT_STREAM_PERIOD_US);
|
USECS_TO_CYCLES(ARCH_TIMER_EVT_STREAM_PERIOD_US);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user