|
@@ -522,10 +522,11 @@ static void tick_broadcast_init_next_event(struct cpumask *mask,
|
|
|
*/
|
|
|
void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
|
|
|
{
|
|
|
+ int cpu = smp_processor_id();
|
|
|
+
|
|
|
/* Set it up only once ! */
|
|
|
if (bc->event_handler != tick_handle_oneshot_broadcast) {
|
|
|
int was_periodic = bc->mode == CLOCK_EVT_MODE_PERIODIC;
|
|
|
- int cpu = smp_processor_id();
|
|
|
|
|
|
bc->event_handler = tick_handle_oneshot_broadcast;
|
|
|
clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);
|
|
@@ -551,6 +552,15 @@ void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
|
|
|
tick_broadcast_set_event(tick_next_period, 1);
|
|
|
} else
|
|
|
bc->next_event.tv64 = KTIME_MAX;
|
|
|
+ } else {
|
|
|
+ /*
|
|
|
+ * The first cpu which switches to oneshot mode sets
|
|
|
+ * the bit for all other cpus which are in the general
|
|
|
+ * (periodic) broadcast mask. So the bit is set and
|
|
|
+ * would prevent the first broadcast enter after this
|
|
|
+ * to program the bc device.
|
|
|
+ */
|
|
|
+ tick_broadcast_clear_oneshot(cpu);
|
|
|
}
|
|
|
}
|
|
|
|