It is possible for cpu to become offlined before irq disabled in idle
loop, which will cause this cpu stay in C state and can't wakeup to
play dead.
Signed-off-by: Wei Gang <gang.wei@intel.com>
Signed-off-by: Yu Ke <ke.yu@intel.com>
xen-unstable changeset: 21030:
bce90bb3ce2c
xen-unstable date: Mon Mar 15 13:17:38 2010 +0000
*/
local_irq_disable();
- if ( softirq_pending(smp_processor_id()) )
+ if ( softirq_pending(smp_processor_id()) ||
+ cpu_is_offline(smp_processor_id()) )
{
local_irq_enable();
sched_tick_resume();
static void default_idle(void)
{
local_irq_disable();
- if ( !softirq_pending(smp_processor_id()) )
+ if ( !softirq_pending(smp_processor_id()) &&
+ cpu_online(smp_processor_id()) )
safe_halt();
else
local_irq_enable();