|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 2/6] 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 <dario.faggioli@xxxxxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
---
Cc: Julien Grall <julien.grall@xxxxxxx>
---
xen/arch/arm/domain.c | 29 ++++++++++++++++++++---------
1 file changed, 20 insertions(+), 9 deletions(-)
diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index eeebbdb..2160d2b 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();
@@ -52,15 +71,7 @@ void idle_loop(void)
if ( unlikely(tasklet_work_to_do(cpu)) )
do_tasklet();
else
- {
- local_irq_disable();
- if ( cpu_is_haltable(cpu) )
- {
- dsb(sy);
- wfi();
- }
- local_irq_enable();
- }
+ do_idle();
do_softirq();
/*
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |