All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] - Complete IRQ interrupt migration in arch_enable_uv_irq()
@ 2009-07-20 14:28 Jack Steiner
  2009-08-04 15:32 ` [tip:x86/urgent] x86, UV: " tip-bot for Jack Steiner
  0 siblings, 1 reply; 2+ messages in thread
From: Jack Steiner @ 2009-07-20 14:28 UTC (permalink / raw)
  To: mingo, tglx; +Cc: linux-kernel

In uv_setup_irq(), the call to create_irq() initially assigns IRQ
vectors to cpu 0. The subsequent call to assign_irq_vector() in
arch_enable_uv_irq() migrates the IRQ to another cpu and frees the cpu
0 vector - at least it will be freed as soon as the "IRQ move"
completes. 

arch_enable_uv_irq() needs to send a cleanup IPI to complete the IRQ move.
Otherwise, assignment of GRU interrupts on large systems (>200 cpus)
will exhaust the cpu 0 interrupt vectors and initialization of the GRU
driver will fail.

Signed-off-by: Jack Steiner <steiner@sgi.com>


---
 arch/x86/kernel/apic/io_apic.c |    3 +++
 1 file changed, 3 insertions(+)

Index: linux/arch/x86/kernel/apic/io_apic.c
===================================================================
--- linux.orig/arch/x86/kernel/apic/io_apic.c	2009-07-20 07:55:46.000000000 -0500
+++ linux/arch/x86/kernel/apic/io_apic.c	2009-07-20 07:56:33.000000000 -0500
@@ -3737,6 +3737,9 @@ int arch_enable_uv_irq(char *irq_name, u
 	mmr_pnode = uv_blade_to_pnode(mmr_blade);
 	uv_write_global_mmr64(mmr_pnode, mmr_offset, mmr_value);
 
+	if (cfg->move_in_progress)
+		send_cleanup_vector(cfg);
+
 	return irq;
 }
 

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [tip:x86/urgent] x86, UV: Complete IRQ interrupt migration in arch_enable_uv_irq()
  2009-07-20 14:28 [PATCH] - Complete IRQ interrupt migration in arch_enable_uv_irq() Jack Steiner
@ 2009-08-04 15:32 ` tip-bot for Jack Steiner
  0 siblings, 0 replies; 2+ messages in thread
From: tip-bot for Jack Steiner @ 2009-08-04 15:32 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: linux-kernel, hpa, mingo, steiner, tglx, mingo

Commit-ID:  2a5ef41661b56cf4eee042a6967c4e14b63e8eac
Gitweb:     http://git.kernel.org/tip/2a5ef41661b56cf4eee042a6967c4e14b63e8eac
Author:     Jack Steiner <steiner@sgi.com>
AuthorDate: Mon, 20 Jul 2009 09:28:41 -0500
Committer:  Ingo Molnar <mingo@elte.hu>
CommitDate: Tue, 4 Aug 2009 16:32:52 +0200

x86, UV: Complete IRQ interrupt migration in arch_enable_uv_irq()

In uv_setup_irq(), the call to create_irq() initially assigns
IRQ vectors to cpu 0. The subsequent call to
assign_irq_vector() in arch_enable_uv_irq() migrates the IRQ to
another cpu and frees the cpu 0 vector - at least it will be
freed as soon as the "IRQ move" completes.

arch_enable_uv_irq() needs to send a cleanup IPI to complete
the IRQ move. Otherwise, assignment of GRU interrupts on large
systems (>200 cpus) will exhaust the cpu 0 interrupt vectors
and initialization of the GRU driver will fail.

Signed-off-by: Jack Steiner <steiner@sgi.com>
LKML-Reference: <20090720142840.GA8885@sgi.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>


---
 arch/x86/kernel/apic/io_apic.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 2284a48..d2ed6c5 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -3793,6 +3793,9 @@ int arch_enable_uv_irq(char *irq_name, unsigned int irq, int cpu, int mmr_blade,
 	mmr_pnode = uv_blade_to_pnode(mmr_blade);
 	uv_write_global_mmr64(mmr_pnode, mmr_offset, mmr_value);
 
+	if (cfg->move_in_progress)
+		send_cleanup_vector(cfg);
+
 	return irq;
 }
 

^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2009-08-04 15:33 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-07-20 14:28 [PATCH] - Complete IRQ interrupt migration in arch_enable_uv_irq() Jack Steiner
2009-08-04 15:32 ` [tip:x86/urgent] x86, UV: " tip-bot for Jack Steiner

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.