Skip to contentSkip to conversation

Fix regression. Make hot unlplug of CPU0 work again.

PATCH In review Tony Breeds 4 participants 7 messages Oct 5, 2007 – Oct 11, 2007 PowerPC

lore
Share & tools
lore
#0 lore raw

Early in the 2.6.23 cycle we broke the ability to offline cpu0 (7ccb4a662462616f6be5053e26b79580e02f1529). This patch fixes that by ensuring that the (xics) default irq server, will not be 0 when taking cpu0 offline.

Also catches a use of irq, when virq should be used (I think that the last one).

---

Unless there is a problem with this patch, it'd be nice to get it into 2.6.23 :)

 arch/powerpc/platforms/pseries/xics.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)
arch/powerpc/platforms/pseries/xics.c +10 -1
index f0b5ff1..2fb8fd0 100644
@@ -837,6 +837,15 @@ void xics_migrate_irqs_away(void)
 	/* Allow IPIs again... */
 	xics_set_cpu_priority(cpu, DEFAULT_PRIORITY);
 
+	/* It would be bad to migrate any IRQs to the CPU we're taking down */
+	if (default_server == cpu) {
+		unsigned int new_server = first_cpu(cpu_online_map);
+
+		default_server = get_hard_smp_processor_id(new_server);
+		printk(KERN_WARNING "%s: default server was %d, reset to %d\n",
+		       __func__, cpu, default_server);
+	}
+
 	for_each_irq(virq) {
 		struct irq_desc *desc;
 		int xics_status[2];
@@ -882,7 +891,7 @@ void xics_migrate_irqs_away(void)
 
 		/* Reset affinity to all cpus */
 		desc->chip->set_affinity(virq, CPU_MASK_ALL);
-		irq_desc[irq].affinity = CPU_MASK_ALL;
+		irq_desc[virq].affinity = CPU_MASK_ALL;
 unlock:
 		spin_unlock_irqrestore(&desc->lock, flags);
 	}

Yours Tony

linux.conf.au http://linux.conf.au/ || http://lca2008.linux.org.au/
Jan 28 - Feb 02 2008 The Australian Linux Technical Conference!

#1 lore raw
Quoted 7 lines · Tony Breeds

Early in the 2.6.23 cycle we broke the ability to offline cpu0 (7ccb4a662462616f6be5053e26b79580e02f1529). This patch fixes that by ensuring that the (xics) default irq server, will not be 0 when taking cpu0 offline.

Also catches a use of irq, when virq should be used (I think that the last one).

Hmm testing, this on a JS21 shows that it doesn't work. I guess I'll go back to the drawing board.

Yours Tony

linux.conf.au http://linux.conf.au/ || http://lca2008.linux.org.au/
Jan 28 - Feb 02 2008 The Australian Linux Technical Conference!

#2 lore raw
Quoted 11 lines · Tony Breeds
Quoted 7 lines · Tony Breeds

Early in the 2.6.23 cycle we broke the ability to offline cpu0 (7ccb4a662462616f6be5053e26b79580e02f1529). This patch fixes that by ensuring that the (xics) default irq server, will not be 0 when taking cpu0 offline.

Also catches a use of irq, when virq should be used (I think that the last one).

Hmm testing, this on a JS21 shows that it doesn't work. I guess I'll go back to the drawing board.

Maybe we should revert the original patch and go back to the drawing board for 2.6.24? Making sure we address the initial problem (which was exposed by kexec I think) and that we don't break cpu hotplug on the way.

cheers

Signature · 8 lines
Michael Ellerman
OzLabs, IBM Australia Development Lab

wwweb: http://michael.ellerman.id.au
phone: +61 2 6212 1183 (tie line 70 21183)

We do not inherit the earth from our ancestors,
we borrow it from our children. - S.M.A.R.T Person
#3 lore raw

Re: Patch: Fix regression. Make hot unlplug of CPU0 work again.

In reply to Tony Breeds
Quoted 11 lines · Tony Breeds
Quoted 8 lines · Tony Breeds

Early in the 2.6.23 cycle we broke the ability to offline cpu0 (7ccb4a662462616f6be5053e26b79580e02f1529). This patch fixes that by ensuring that the (xics) default irq server, will not be 0 when taking cpu0 offline.

Also catches a use of irq, when virq should be used (I think that the last one).

Hmm testing, this on a JS21 shows that it doesn't work. I guess I'll go back to the drawing board.

Reviewing the first patch, xics_set_affinity no longer looks at the cpu_mask arg, instead get_irq_server reads it from the irq descriptor.

---
On top of tonys patch (13926)

I don't have a system to test hotplug, so this is only compile tested.

A more complete fix might be to pass the cpu_mask struct to get_irq_server, but kernel/irq/manage.c currently sets the descriptor first.

arch/powerpc/platforms/pseries/xics.c +1 -1
Index: kernel/arch/powerpc/platforms/pseries/xics.c
===================================================================
@@ -890,8 +890,8 @@ void xics_migrate_irqs_away(void)
 		       virq, cpu);
 
 		/* Reset affinity to all cpus */
-		desc->chip->set_affinity(virq, CPU_MASK_ALL);
 		irq_desc[virq].affinity = CPU_MASK_ALL;
+		desc->chip->set_affinity(virq, CPU_MASK_ALL);
 unlock:
 		spin_unlock_irqrestore(&desc->lock, flags);
 	}
#4 lore raw

PATCH v2 1/1 Fix regression. Make hot unlplug of CPU0 work again.

Early in the 2.6.23 cycle we broke the ability to offline cpu0 (7ccb4a662462616f6be5053e26b79580e02f1529). This patch fixes that by ensuring that the (xics) default irq server, will not be 0 when taking cpu0 offline.

Also catches a use of irq, when virq should be used (I think that's the last one).

This patch also include the fix from Milton which makes JS21 work aswell. In the commit message for that patch Milton writes:
xics_set_affinity no longer looks at the cpu_mask arg, instead get_irq_server reads it from the irq descriptor.

---
Milton also says in his patch:

Quoted 2 lines

A more complete fix might be to pass the cpu_mask struct to get_irq_server, but kernel/irq/manage.c currently sets the descriptor first.

 arch/powerpc/platforms/pseries/xics.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)
arch/powerpc/platforms/pseries/xics.c +10 -1
index f0b5ff1..217ae5d 100644
@@ -837,6 +837,15 @@ void xics_migrate_irqs_away(void)
 	/* Allow IPIs again... */
 	xics_set_cpu_priority(cpu, DEFAULT_PRIORITY);
 
+	/* It would be bad to migrate any IRQs to the CPU we're taking down */
+	if (default_server == cpu) {
+		unsigned int new_server = first_cpu(cpu_online_map);
+
+		default_server = get_hard_smp_processor_id(new_server);
+		printk(KERN_WARNING "%s: default server was %d, reset to %d\n",
+		       __func__, cpu, default_server);
+	}
+
 	for_each_irq(virq) {
 		struct irq_desc *desc;
 		int xics_status[2];
@@ -881,8 +890,8 @@ void xics_migrate_irqs_away(void)
 		       virq, cpu);
 
 		/* Reset affinity to all cpus */
+		irq_desc[virq].affinity = CPU_MASK_ALL;
 		desc->chip->set_affinity(virq, CPU_MASK_ALL);
-		irq_desc[irq].affinity = CPU_MASK_ALL;
 unlock:
 		spin_unlock_irqrestore(&desc->lock, flags);
 	}

Yours Tony

linux.conf.au http://linux.conf.au/ || http://lca2008.linux.org.au/
Jan 28 - Feb 02 2008 The Australian Linux Technical Conference!

#5 lore raw
Quoted 6 lines · In message <[email protected]> you wrote:

Early in the 2.6.23 cycle we broke the ability to offline cpu0 (7ccb4a662462616f6be5053e26b79580e02f1529). This patch fixes that by ensuring that the (xics) default irq server, will not be 0 when taking cpu0 offline.

Quoted 7 lines

Also catches a use of irq, when virq should be used (I think that's the last one).

This patch also include the fix from Milton which makes JS21 work aswell. In the commit message for that patch Milton writes:
xics_set_affinity no longer looks at the cpu_mask arg, instead get_irq_server reads it from the irq descriptor.

This doesn't fix the problem for me.

If I offline CPU0, then online it again, it's fine, but doing the same for CPU1 kills the machine.

Mikey

arch/powerpc/platforms/p

Quoted 13 lines

---
Milton also says in his patch:

Quoted 2 lines

A more complete fix might be to pass the cpu_mask struct to get_irq_server, but kernel/irq/manage.c currently sets the descriptor first.

 arch/powerpc/platforms/pseries/xics.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)
arch/powerpc/platforms/p renamed from arch/powerpc/platforms/pseries/xics.c +0 -0

series/xics.c

Quoted 40 lines

index f0b5ff1..217ae5d 100644

arch/powerpc/platforms/pseries/xics.c +10 -1
@@ -837,6 +837,15 @@ void xics_migrate_irqs_away(void)
 	/* Allow IPIs again... */
 	xics_set_cpu_priority(cpu, DEFAULT_PRIORITY);
 
+	/* It would be bad to migrate any IRQs to the CPU we're taking down */
+	if (default_server == cpu) {
+		unsigned int new_server = first_cpu(cpu_online_map);
+
+		default_server = get_hard_smp_processor_id(new_server);
+		printk(KERN_WARNING "%s: default server was %d, reset to %d\n",
+		       __func__, cpu, default_server);
+	}
+
 	for_each_irq(virq) {
 		struct irq_desc *desc;
 		int xics_status[2];
@@ -881,8 +890,8 @@ void xics_migrate_irqs_away(void)
 		       virq, cpu);
 
 		/* Reset affinity to all cpus */
+		irq_desc[virq].affinity = CPU_MASK_ALL;
 		desc->chip->set_affinity(virq, CPU_MASK_ALL);
-		irq_desc[irq].affinity = CPU_MASK_ALL;
 unlock:
 		spin_unlock_irqrestore(&desc->lock, flags);
 	}

Yours Tony

linux.conf.au http://linux.conf.au/ || http://lca2008.linux.org.au/
Jan 28 - Feb 02 2008 The Australian Linux Technical Conference!

_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://ozlabs.org/mailman/listinfo/linuxppc-dev

#6 lore raw
In reply to Tony Breeds
Quoted 29 lines · Tony Breeds

Early in the 2.6.23 cycle we broke the ability to offline cpu0 (7ccb4a662462616f6be5053e26b79580e02f1529). This patch fixes that by ensuring that the (xics) default irq server, will not be 0 when taking cpu0 offline.

Also catches a use of irq, when virq should be used (I think that's the last one).

This patch also include the fix from Milton which makes JS21 work aswell. In the commit message for that patch Milton writes:
xics_set_affinity no longer looks at the cpu_mask arg, instead get_irq_server reads it from the irq descriptor.

---
Milton also says in his patch:

Quoted 2 lines

A more complete fix might be to pass the cpu_mask struct to get_irq_server, but kernel/irq/manage.c currently sets the descriptor first.

 arch/powerpc/platforms/pseries/xics.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)
arch/powerpc/platforms/pseries/xics.c +0 -0
index f0b5ff1..217ae5d 100644

arch/powerpc/platforms/pseries/xics.c void xics_migrate_irqs_away(void) · line 846

Quoted 10 lines
arch/powerpc/platforms/pseries/xics.c +7 -0
@@ -837,6 +837,15 @@ void xics_migrate_irqs_away(void)
 	/* Allow IPIs again... */
 	xics_set_cpu_priority(cpu, DEFAULT_PRIORITY);
 
+	/* It would be bad to migrate any IRQs to the CPU we're taking down */
+	if (default_server == cpu) {
+		unsigned int new_server = first_cpu(cpu_online_map);
+
+		default_server = get_hard_smp_processor_id(new_server);
+		printk(KERN_WARNING "%s: default server was %d, reset to %d\n",
+		       __func__, cpu, default_server);

WARNING? It's not like the user can do anything about it.

cheers

Signature · 8 lines
Michael Ellerman
OzLabs, IBM Australia Development Lab

wwweb: http://michael.ellerman.id.au
phone: +61 2 6212 1183 (tie line 70 21183)

We do not inherit the earth from our ancestors,
we borrow it from our children. - S.M.A.R.T Person