Once stop_machine() is gone from the CPU offline path, we won't be able to depend on disabling preemption to prevent CPUs from going offline from under us. Use the get/put_online_cpus_atomic() APIs to prevent CPUs from going offline, while invoking from atomic context. Cc: John Stultz <john.stultz@xxxxxxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@xxxxxxxxxxxxxxxxxx> --- kernel/time/clocksource.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index e713ef7..c4bbc25 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c @@ -30,6 +30,7 @@ #include <linux/sched.h> /* for spin_unlock_irq() using preempt_count() m68k */ #include <linux/tick.h> #include <linux/kthread.h> +#include <linux/cpu.h> #include "tick-internal.h" @@ -252,6 +253,7 @@ static void clocksource_watchdog(unsigned long data) int64_t wd_nsec, cs_nsec; int next_cpu, reset_pending; + get_online_cpus_atomic(); spin_lock(&watchdog_lock); if (!watchdog_running) goto out; @@ -329,6 +331,7 @@ static void clocksource_watchdog(unsigned long data) add_timer_on(&watchdog_timer, next_cpu); out: spin_unlock(&watchdog_lock); + put_online_cpus_atomic(); } static inline void clocksource_start_watchdog(void) @@ -367,6 +370,7 @@ static void clocksource_enqueue_watchdog(struct clocksource *cs) { unsigned long flags; + get_online_cpus_atomic(); spin_lock_irqsave(&watchdog_lock, flags); if (cs->flags & CLOCK_SOURCE_MUST_VERIFY) { /* cs is a clocksource to be watched. */ @@ -386,6 +390,7 @@ static void clocksource_enqueue_watchdog(struct clocksource *cs) /* Check if the watchdog timer needs to be started. */ clocksource_start_watchdog(); spin_unlock_irqrestore(&watchdog_lock, flags); + put_online_cpus_atomic(); } static void clocksource_dequeue_watchdog(struct clocksource *cs) -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html