From: Dario Faggioli Date: Wed, 30 Aug 2017 11:06:20 +0000 (+0100) Subject: xen: ARM: suspend the tick (if in use) when going idle. X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~1521 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=05c52278a7c92bc753d9fe32017e4961012b9f23;p=xen.git xen: ARM: suspend the tick (if in use) when going idle. Since commit 964fae8ac ("cpuidle: suspend/resume scheduler tick timer during cpu idle state entry/exit"), if a scheduler has a periodic tick timer, we stop it when going idle. This, however, is only true for x86. Make it true for ARM as well. Signed-off-by: Dario Faggioli Reviewed-by: Stefano Stabellini Reviewed-by: Tim Deegan --- diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index ee0886ee7d..6512f01463 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -39,6 +39,25 @@ DEFINE_PER_CPU(struct vcpu *, curr_vcpu); +static void do_idle(void) +{ + unsigned int cpu = smp_processor_id(); + + sched_tick_suspend(); + /* sched_tick_suspend() can raise TIMER_SOFTIRQ. Process it now. */ + process_pending_softirqs(); + + local_irq_disable(); + if ( cpu_is_haltable(cpu) ) + { + dsb(sy); + wfi(); + } + local_irq_enable(); + + sched_tick_resume(); +} + void idle_loop(void) { unsigned int cpu = smp_processor_id(); @@ -58,15 +77,7 @@ void idle_loop(void) */ else if ( !softirq_pending(cpu) && !scrub_free_pages() && !softirq_pending(cpu) ) - { - local_irq_disable(); - if ( cpu_is_haltable(cpu) ) - { - dsb(sy); - wfi(); - } - local_irq_enable(); - } + do_idle(); do_softirq(); /*