Skip to contentSkip to conversation

mrst/apbt: set correct irq affinity for secondary cpu

PATCH In review [email protected] 1 participant 2 messages Jan 14, 2011 x86

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mrst/apbt: set correct irq affinity for secondary cpu

From: Jacob Pan <[email protected]>

Offlining the secondary CPU causes timer irq affinity to be set to CPU0 in 37 kernel. When the secondary CPU is back online again, the wrong irq affinity will be used.

This patch ensures secondary per CPU timer always has the correct IRQ affinity when enabled.

---
 arch/x86/kernel/apb_timer.c |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)
arch/x86/kernel/apb_timer.c +8 -6
index 7c9ab59..51ef31a 100644
@@ -313,14 +313,16 @@ static void apbt_setup_irq(struct apbt_dev *adev)
 	if (adev->irq == 0)
 		return;
 
+	irq_modify_status(adev->irq, 0, IRQ_MOVE_PCNTXT);
+	irq_set_affinity(adev->irq, cpumask_of(adev->cpu));
+	/* APB timer irqs are set up as mp_irqs, timer is edge type */
+	__set_irq_handler(adev->irq, handle_edge_irq, 0, "edge");
+
 	if (system_state == SYSTEM_BOOTING) {
-		irq_modify_status(adev->irq, 0, IRQ_MOVE_PCNTXT);
-		irq_set_affinity(adev->irq, cpumask_of(adev->cpu));
-		/* APB timer irqs are set up as mp_irqs, timer is edge type */
-		__set_irq_handler(adev->irq, handle_edge_irq, 0, "edge");
 		if (request_irq(adev->irq, apbt_interrupt_handler,
-				IRQF_TIMER | IRQF_DISABLED | IRQF_NOBALANCING,
-				adev->name, adev)) {
+					IRQF_TIMER | IRQF_DISABLED |
+					IRQF_NOBALANCING,
+					adev->name, adev)) {
 			printk(KERN_ERR "Failed request IRQ for APBT%d\n",
 			       adev->num);
 		}
Signature · 1 line
1.7.0.4
#1 lore raw

[tip:x86/urgent] x86, mrst: Set correct APB timer IRQ affinity for secondary cpu

Commit-ID:  6550904ddbc3c286798a87edf95eeebcc62bc58a
Gitweb:     http://git.kernel.org/tip/6550904ddbc3c286798a87edf95eeebcc62bc58a
Author:     Jacob Pan <[email protected]>
AuthorDate: Thu, 13 Jan 2011 16:06:44 -0800
Committer:  H. Peter Anvin <[email protected]>
CommitDate: Fri, 14 Jan 2011 11:53:44 -0800

x86, mrst: Set correct APB timer IRQ affinity for secondary cpu

Offlining the secondary CPU causes the timer irq affinity to be set to CPU 0. When the secondary CPU is back online again, the wrong irq affinity will be used.

This patch ensures secondary per CPU timer always has the correct IRQ affinity when enabled.

LKML-Reference: <[email protected]>

---
 arch/x86/kernel/apb_timer.c |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)
arch/x86/kernel/apb_timer.c +8 -6
index 7c9ab59..51ef31a 100644
@@ -313,14 +313,16 @@ static void apbt_setup_irq(struct apbt_dev *adev)
 	if (adev->irq == 0)
 		return;
 
+	irq_modify_status(adev->irq, 0, IRQ_MOVE_PCNTXT);
+	irq_set_affinity(adev->irq, cpumask_of(adev->cpu));
+	/* APB timer irqs are set up as mp_irqs, timer is edge type */
+	__set_irq_handler(adev->irq, handle_edge_irq, 0, "edge");
+
 	if (system_state == SYSTEM_BOOTING) {
-		irq_modify_status(adev->irq, 0, IRQ_MOVE_PCNTXT);
-		irq_set_affinity(adev->irq, cpumask_of(adev->cpu));
-		/* APB timer irqs are set up as mp_irqs, timer is edge type */
-		__set_irq_handler(adev->irq, handle_edge_irq, 0, "edge");
 		if (request_irq(adev->irq, apbt_interrupt_handler,
-				IRQF_TIMER | IRQF_DISABLED | IRQF_NOBALANCING,
-				adev->name, adev)) {
+					IRQF_TIMER | IRQF_DISABLED |
+					IRQF_NOBALANCING,
+					adev->name, adev)) {
 			printk(KERN_ERR "Failed request IRQ for APBT%d\n",
 			       adev->num);
 		}