nohz: Fix notifier return val that enforce timekeeping
Li Zhong [Fri, 17 May 2013 08:44:04 +0000 (16:44 +0800)]
In tick_nohz_cpu_down_callback() if the cpu is the one handling
timekeeping, we must return something that stops the CPU_DOWN_PREPARE
notifiers and then start notify CPU_DOWN_FAILED on the already called
notifier call backs.

However traditional errno values are not handled by the notifier unless
these are encapsulated using errno_to_notifier().

Hence the current -EINVAL is misinterpreted and converted to junk after
notifier_to_errno(), leaving the notifier subsystem to random behaviour
such as eventually allowing the cpu to go down.

Fix this by using the standard NOTIFY_BAD instead.

Signed-off-by: Li Zhong <>
Reviewed-by: Srivatsa S. Bhat <>
Acked-by: Steven Rostedt <>
Cc: Paul E. McKenney <>
Cc: Ingo Molnar <>
Cc: Thomas Gleixner <>
Cc: Peter Zijlstra <>
Cc: Borislav Petkov <>
Signed-off-by: Frederic Weisbecker <>
Signed-off-by: Ingo Molnar <>


index f420813..0cf1c14 100644 (file)
@@ -306,7 +306,7 @@ static int __cpuinit tick_nohz_cpu_down_callback(struct notifier_block *nfb,
                 * we can't safely shutdown that CPU.
                if (have_nohz_full_mask && tick_do_timer_cpu == cpu)
-                       return -EINVAL;
+                       return NOTIFY_BAD;
        return NOTIFY_OK;