Skip to content
  • David Daney's avatar
    smp.h: Use local_irq_{save,restore}() in !SMP version of on_each_cpu(). · f21afc25
    David Daney authored
    Thanks to commit f91eb62f
    
     ("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: default avatarDavid Daney <david.daney@cavium.com>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f21afc25