Browse Source

clockevents: do not shutdown the oneshot broadcast device

When a cpu goes offline it is removed from the broadcast masks. If the
mask becomes empty the code shuts down the broadcast device. This is
wrong, because the broadcast device needs to be ready for the online
cpu going idle (into a c-state, which stops the local apic timer).

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Thomas Gleixner 17 năm trước cách đây
mục cha
commit
31d9b3938c
1 tập tin đã thay đổi với 4 bổ sung7 xóa
  1. 4 7
      kernel/time/tick-broadcast.c

+ 4 - 7
kernel/time/tick-broadcast.c

@@ -560,20 +560,17 @@ void tick_broadcast_switch_to_oneshot(void)
  */
  */
 void tick_shutdown_broadcast_oneshot(unsigned int *cpup)
 void tick_shutdown_broadcast_oneshot(unsigned int *cpup)
 {
 {
-	struct clock_event_device *bc;
 	unsigned long flags;
 	unsigned long flags;
 	unsigned int cpu = *cpup;
 	unsigned int cpu = *cpup;
 
 
 	spin_lock_irqsave(&tick_broadcast_lock, flags);
 	spin_lock_irqsave(&tick_broadcast_lock, flags);
 
 
-	bc = tick_broadcast_device.evtdev;
+	/*
+	 * Clear the broadcast mask flag for the dead cpu, but do not
+	 * stop the broadcast device!
+	 */
 	cpu_clear(cpu, tick_broadcast_oneshot_mask);
 	cpu_clear(cpu, tick_broadcast_oneshot_mask);
 
 
-	if (tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT) {
-		if (bc && cpus_empty(tick_broadcast_oneshot_mask))
-			clockevents_set_mode(bc, CLOCK_EVT_MODE_SHUTDOWN);
-	}
-
 	spin_unlock_irqrestore(&tick_broadcast_lock, flags);
 	spin_unlock_irqrestore(&tick_broadcast_lock, flags);
 }
 }