tick/broadcast: Return busy when IPI is pending

Tell the idle code not to go deep if the broadcast IPI is about to
arrive.

[ Split out from a larger combo patch ]

Tested-by: Sudeep Holla <sudeep.holla@arm.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Suzuki Poulose <Suzuki.Poulose@arm.com>
Cc: Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>
Cc: Catalin Marinas <Catalin.Marinas@arm.com>
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Preeti U Murthy <preeti@linux.vnet.ibm.com>
Cc: Ingo Molnar <mingo@kernel.org>
Link: http://lkml.kernel.org/r/alpine.DEB.2.11.1507070929360.3916@nanos
This commit is contained in:
Thomas Gleixner 2015-07-07 16:45:15 +02:00
parent d33257264b
commit 0cc5281aa5

View File

@ -725,12 +725,16 @@ int __tick_broadcast_oneshot_control(enum tick_broadcast_state state)
* if the cpu local event is earlier than the * if the cpu local event is earlier than the
* broadcast event. If the current CPU is in * broadcast event. If the current CPU is in
* the force mask, then we are going to be * the force mask, then we are going to be
* woken by the IPI right away. * woken by the IPI right away; we return
* busy, so the CPU does not try to go deep
* idle.
*/ */
if (!cpumask_test_cpu(cpu, tick_broadcast_force_mask) && if (cpumask_test_cpu(cpu, tick_broadcast_force_mask)) {
dev->next_event.tv64 < bc->next_event.tv64) ret = -EBUSY;
} else if (dev->next_event.tv64 < bc->next_event.tv64) {
tick_broadcast_set_event(bc, cpu, dev->next_event); tick_broadcast_set_event(bc, cpu, dev->next_event);
} }
}
/* /*
* If the current CPU owns the hrtimer broadcast * If the current CPU owns the hrtimer broadcast
* mechanism, it cannot go deep idle and we remove the * mechanism, it cannot go deep idle and we remove the