linux/drivers/irqchip
Shawn Guo 8b6fd65264 irqchip: gic: call gic_cpu_init() as well in CPU_STARTING_FROZEN case
Commit c011470 (irqchip: gic: Perform the gic_secondary_init() call via
CPU notifier) moves gic_secondary_init() that used to be called in
.smp_secondary_init hook into a notifier call.  But it changes the
system behavior a little bit.  Before the commit, gic_cpu_init()
is called not only when kernel brings up the secondary cores but also
when system resuming procedure hot-plugs the cores back to kernel.
While after the commit, the function will not be called in the latter
case, where the 'action' will not be CPU_STARTING but
CPU_STARTING_FROZEN.  This behavior difference at least causes the
following suspend/resume regression on imx6q.

$ echo mem > /sys/power/state
PM: Syncing filesystems ... done.
PM: Preparing system for mem sleep
mmc1: card e624 removed
Freezing user space processes ... (elapsed 0.01 seconds) done.
Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done.
PM: Entering mem sleep
PM: suspend of devices complete after 5.930 msecs
PM: suspend devices took 0.010 seconds
PM: late suspend of devices complete after 0.343 msecs
PM: noirq suspend of devices complete after 0.828 msecs
Disabling non-boot CPUs ...
CPU1: shutdown
CPU2: shutdown
CPU3: shutdown
Enabling non-boot CPUs ...
CPU1: Booted secondary processor
INFO: rcu_sched detected stalls on CPUs/tasks: { 1 2 3} (detected by 0, t=2102 jiffies, g=4294967169, c=4294967168, q=17)
Task dump for CPU 1:
swapper/1       R running      0     0      1 0x00000000
Backtrace:
[<bf895ff4>] (0xbf895ff4) from [<00000000>] (  (null))
Backtrace aborted due to bad frame pointer <8007ccdc>
Task dump for CPU 2:
swapper/2       R running      0     0      1 0x00000000
Backtrace:
[<8075dbdc>] (0x8075dbdc) from [<00000000>] (  (null))
Backtrace aborted due to bad frame pointer <00000002>
Task dump for CPU 3:
swapper/3       R running      0     0      1 0x00000000
Backtrace:
[<8075dbdc>] (0x8075dbdc) from [<00000000>] (  (null))

Fix the regression by checking 'action' being CPU_STARTING_FROZEN to
have gic_cpu_init() called for secondary cores when system resumes.

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Tested-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
2013-06-20 14:52:23 +02:00
..
exynos-combiner.c ARM: late Exynos multiplatform changes 2013-05-07 11:28:42 -07:00
irq-armada-370-xp.c ARM: arm-soc: late cleanups 2013-05-07 11:22:14 -07:00
irq-bcm2835.c irqchip: irq-bcm2835: Add terminating entry for of_device_id table 2012-11-06 07:37:10 -08:00
irq-gic.c irqchip: gic: call gic_cpu_init() as well in CPU_STARTING_FROZEN case 2013-06-20 14:52:23 +02:00
irq-metag-ext.c metag: Internal and external irqchips 2013-03-02 20:09:48 +00:00
irq-metag.c metag: Internal and external irqchips 2013-03-02 20:09:48 +00:00
irq-mxs.c ARM: mxs: icoll: Fix interrupts gpio bank 0 2013-06-03 23:18:15 +08:00
irq-renesas-intc-irqpin.c irqchip: intc-irqpin: Add support for shared interrupt lines 2013-03-28 16:39:46 +09:00
irq-renesas-irqc.c irqchip: irqc: Add DT support 2013-03-18 21:26:07 +09:00
irq-s3c24xx.c ARM: arm-soc driver changes for 3.10 2013-05-04 12:31:18 -07:00
irq-sirfsoc.c ARM: sirf: move irq driver to drivers/irqchip 2013-03-25 12:29:39 +01:00
irq-sun4i.c irqchip: sunxi: Rename sunxi to sun4i 2013-04-08 21:42:46 +02:00
irq-versatile-fpga.c irq: versatile: rename Kconfig macro in printk 2013-03-27 11:40:34 +01:00
irq-vic.c irqchip: vic: add include of linux/irq.h 2013-04-02 15:09:47 -07:00
irq-vt8500.c irqchip: vt8500: Convert arch-vt8500 to new irqchip infrastructure 2013-04-12 22:43:24 -07:00
irqchip.c irqchip: add basic infrastructure 2013-01-10 11:44:38 -06:00
irqchip.h irqchip: add basic infrastructure 2013-01-10 11:44:38 -06:00
Kconfig irqchip: Renesas IRQC driver 2013-03-18 21:26:06 +09:00
Makefile ARM: arm-soc: late cleanups 2013-05-07 11:22:14 -07:00
spear-shirq.c ARM: spear: use common irqchip_init function 2013-01-12 10:52:15 -06:00