• Shawn Guo's avatar
    irqchip: gic: call gic_cpu_init() as well in CPU_STARTING_FROZEN case · 8b6fd652
    Shawn Guo authored
    Commit c0114709 (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: default avatarShawn Guo <shawn.guo@linaro.org>
    Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Tested-by: default avatarJoseph Lo <josephl@nvidia.com>
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    8b6fd652
irq-gic.c 21.7 KB