smp.h: Use local_irq_{save,restore}() in !SMP version of on_each_cpu().

Thanks to commit f91eb62f71b3 ("init: scream bloody murder if interrupts
are enabled too early"), "bloody murder" is now being screamed.

With a MIPS OCTEON config, we use on_each_cpu() in our
irq_chip.irq_bus_sync_unlock() function. This gets called in early as a
result of the time_init() call. Because the !SMP version of
on_each_cpu() unconditionally enables irqs, we get:

WARNING: at init/main.c:560 start_kernel+0x250/0x410()
Interrupts were enabled early
CPU: 0 PID: 0 Comm: swapper Not tainted 3.10.0-rc5-Cavium-Octeon+ #801
Call Trace:
show_stack+0x68/0x80
warn_slowpath_common+0x78/0xb0
warn_slowpath_fmt+0x38/0x48
start_kernel+0x250/0x410

Suggested fix: Do what we already do in the SMP version of
on_each_cpu(), and use local_irq_save/local_irq_restore. Because we
need a flags variable, make it a static inline to avoid name space
issues.

[ Change from v1: Convert on_each_cpu to a static inline function, add
#include <linux/irqflags.h> to avoid build breakage on some files.

on_each_cpu_mask() and on_each_cpu_cond() suffer the same problem as
on_each_cpu(), but they are not causing !SMP bugs for me, so I will
defer changing them to a less urgent patch. ]

Signed-off-by: David Daney <david.daney@cavium.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by David Daney and committed by Linus Torvalds f21afc25 d0ff9348

Changed files
+12 -7
include
linux
+12 -7
include/linux/smp.h
··· 11 11 #include <linux/list.h> 12 12 #include <linux/cpumask.h> 13 13 #include <linux/init.h> 14 + #include <linux/irqflags.h> 14 15 15 16 extern void cpu_idle(void); 16 17 ··· 140 139 } 141 140 #define smp_call_function(func, info, wait) \ 142 141 (up_smp_call_function(func, info)) 143 - #define on_each_cpu(func,info,wait) \ 144 - ({ \ 145 - local_irq_disable(); \ 146 - func(info); \ 147 - local_irq_enable(); \ 148 - 0; \ 149 - }) 142 + 143 + static inline int on_each_cpu(smp_call_func_t func, void *info, int wait) 144 + { 145 + unsigned long flags; 146 + 147 + local_irq_save(flags); 148 + func(info); 149 + local_irq_restore(flags); 150 + return 0; 151 + } 152 + 150 153 /* 151 154 * Note we still need to test the mask even for UP 152 155 * because we actually can get an empty mask from