Skip to contentSkip to conversation

irqchip: gic: call gic_cpu_init() as well in CPU_STARTING_FROZEN case

PATCH New Shawn Guo 4 participants 6 messages Jun 12, 2013 – Jun 20, 2013

Subsystems (3)
lore
Share & tools
lore

Shawn Guo

author
#0 lore raw

PATCH 1/1 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.

---
 drivers/irqchip/irq-gic.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/irqchip/irq-gic.c +1 -1
index 1760ceb..19ceaa6 100644
@@ -705,7 +705,7 @@ static int gic_irq_domain_xlate(struct irq_domain *d,
 static int __cpuinit gic_secondary_init(struct notifier_block *nfb,
 					unsigned long action, void *hcpu)
 {
-	if (action == CPU_STARTING)
+	if (action == CPU_STARTING || action == CPU_STARTING_FROZEN)
 		gic_cpu_init(&gic_data[0]);
 	return NOTIFY_OK;
 }
Signature · 1 line
1.7.9.5
#1 lore raw

PATCH 1/1 irqchip: gic: call gic_cpu_init() as well in CPU_STARTING_FROZEN case

drivers/irqchip/irq-gic.c static int gic_irq_domain_xlate(struct irq_domain *d, · line 711

Quoted 13 lines · Shawn Guo
drivers/irqchip/irq-gic.c +1 -1
index 1760ceb..19ceaa6 100644
@@ -705,7 +705,7 @@ static int gic_irq_domain_xlate(struct irq_domain *d,
 static int __cpuinit gic_secondary_init(struct notifier_block *nfb,
 					unsigned long action, void *hcpu)
 {
-	if (action == CPU_STARTING)
+	if (action == CPU_STARTING || action == CPU_STARTING_FROZEN)
 		gic_cpu_init(&gic_data[0]);
 	return NOTIFY_OK;
 }
author
#2 lore raw

PATCH 1/1 irqchip: gic: call gic_cpu_init() as well in CPU_STARTING_FROZEN case

Quoted 16 lines · Catalin Marinas

drivers/irqchip/irq-gic.c static int gic_irq_domain_xlate(struct irq_domain *d, · line 711

Quoted 13 lines · Shawn Guo
drivers/irqchip/irq-gic.c +1 -1
index 1760ceb..19ceaa6 100644
@@ -705,7 +705,7 @@ static int gic_irq_domain_xlate(struct irq_domain *d,
 static int __cpuinit gic_secondary_init(struct notifier_block *nfb,
 					unsigned long action, void *hcpu)
 {
-	if (action == CPU_STARTING)
+	if (action == CPU_STARTING || action == CPU_STARTING_FROZEN)
 		gic_cpu_init(&gic_data[0]);
 	return NOTIFY_OK;
 }

Thomas,

Can you please send the fix for 3.10? Or are you fine with that I ask arm-soc folks to send it?

Shawn

author
#3 lore raw

PATCH 1/1 irqchip: gic: call gic_cpu_init() as well in CPU_STARTING_FROZEN case

Quoted 18 lines · Shawn Guo
Quoted 16 lines · Catalin Marinas

drivers/irqchip/irq-gic.c static int gic_irq_domain_xlate(struct irq_domain *d, · line 711

Quoted 13 lines · Shawn Guo
drivers/irqchip/irq-gic.c +1 -1
index 1760ceb..19ceaa6 100644
@@ -705,7 +705,7 @@ static int gic_irq_domain_xlate(struct irq_domain *d,
 static int __cpuinit gic_secondary_init(struct notifier_block *nfb,
 					unsigned long action, void *hcpu)
 {
-	if (action == CPU_STARTING)
+	if (action == CPU_STARTING || action == CPU_STARTING_FROZEN)
 		gic_cpu_init(&gic_data[0]);
 	return NOTIFY_OK;
 }
Quoted 4 lines

Thomas,

Can you please send the fix for 3.10? Or are you fine with that I ask arm-soc folks to send it?

Arnd, Olof,

Can you help send the fix for 3.10?

Shawn

#4 lore raw

PATCH 1/1 irqchip: gic: call gic_cpu_init() as well in CPU_STARTING_FROZEN case

Quoted 19 lines · Shawn Guo
Quoted 18 lines · Shawn Guo
Quoted 16 lines · Catalin Marinas

drivers/irqchip/irq-gic.c static int gic_irq_domain_xlate(struct irq_domain *d, · line 711

Quoted 13 lines · Shawn Guo
drivers/irqchip/irq-gic.c +1 -1
index 1760ceb..19ceaa6 100644
@@ -705,7 +705,7 @@ static int gic_irq_domain_xlate(struct irq_domain *d,
 static int __cpuinit gic_secondary_init(struct notifier_block *nfb,
 					unsigned long action, void *hcpu)
 {
-	if (action == CPU_STARTING)
+	if (action == CPU_STARTING || action == CPU_STARTING_FROZEN)
 		gic_cpu_init(&gic_data[0]);
 	return NOTIFY_OK;
 }
Quoted 9 lines
Quoted 4 lines

Thomas,

Can you please send the fix for 3.10? Or are you fine with that I ask arm-soc folks to send it?

Arnd, Olof,

Can you help send the fix for 3.10?

The commit c011470 also break suspend/resume for Tegra platform on all 3.10-rcX.

Quoted 11 lines

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.

Shawn's patch fix the suspend/resume regression for Tegra also.

Thanks,
Joseph

#5 lore raw

PATCH 1/1 irqchip: gic: call gic_cpu_init() as well in CPU_STARTING_FROZEN case

Quoted 11 lines · Joseph Lo
Quoted 8 lines
Quoted 3 lines

Can you please send the fix for 3.10? Or are you fine with that I ask arm-soc folks to send it?

Arnd, Olof,

Can you help send the fix for 3.10?

Shawn's patch fix the suspend/resume regression for Tegra also.

Applied to fixes branch.

Arnd