diff options
author | Jan Beulich <jbeulich@suse.com> | 2011-12-13 11:38:57 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2011-12-13 11:38:57 +0100 |
commit | 3c419d3521b66c78e22da14fcf287b586e5df4b7 (patch) | |
tree | 2a367d69aad197034ed1b999c8de62d19d50fb81 /xen/arch | |
parent | dd02b58523c43bf517bb6e9d69b4983068e6b89c (diff) | |
download | xen-3c419d3521b66c78e22da14fcf287b586e5df4b7.tar.gz xen-3c419d3521b66c78e22da14fcf287b586e5df4b7.tar.bz2 xen-3c419d3521b66c78e22da14fcf287b586e5df4b7.zip |
VT-d: bind IRQs to CPUs local to the node the IOMMU is on
This extends create_irq() to take a node parameter, allowing the
resulting IRQ to have its destination set to a CPU on that node right
away, which is more natural than having to post-adjust this (and
get e.g. a new IRQ vector assigned despite a fresh one was just
obtained).
All other callers of create_irq() pass NUMA_NO_NODE for the time being.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch')
-rw-r--r-- | xen/arch/x86/hpet.c | 3 | ||||
-rw-r--r-- | xen/arch/x86/io_apic.c | 6 | ||||
-rw-r--r-- | xen/arch/x86/irq.c | 18 | ||||
-rw-r--r-- | xen/arch/x86/physdev.c | 2 |
4 files changed, 20 insertions, 9 deletions
diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c index c503790cb5..0f6d1a1fbb 100644 --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -11,6 +11,7 @@ #include <xen/smp.h> #include <xen/softirq.h> #include <xen/irq.h> +#include <xen/numa.h> #include <asm/fixmap.h> #include <asm/div64.h> #include <asm/hpet.h> @@ -334,7 +335,7 @@ static int __init hpet_assign_irq(unsigned int idx) { int irq; - if ( (irq = create_irq()) < 0 ) + if ( (irq = create_irq(NUMA_NO_NODE)) < 0 ) return irq; if ( hpet_setup_msi_irq(irq, hpet_events + idx) ) diff --git a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c index 752b3f4758..f5c03b4b35 100644 --- a/xen/arch/x86/io_apic.c +++ b/xen/arch/x86/io_apic.c @@ -995,7 +995,7 @@ static void __init setup_IO_APIC_irqs(void) continue; if (IO_APIC_IRQ(irq)) { - vector = assign_irq_vector(irq); + vector = assign_irq_vector(irq, NULL); BUG_ON(vector < 0); entry.vector = vector; ioapic_register_intr(irq, IOAPIC_AUTO); @@ -2188,7 +2188,7 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int a if (!platform_legacy_irq(irq)) add_pin_to_irq(irq, ioapic, pin); - vector = assign_irq_vector(irq); + vector = assign_irq_vector(irq, NULL); if (vector < 0) return vector; entry.vector = vector; @@ -2340,7 +2340,7 @@ int ioapic_guest_write(unsigned long physbase, unsigned int reg, u32 val) if ( desc->arch.vector <= 0 || desc->arch.vector > LAST_DYNAMIC_VECTOR ) { add_pin_to_irq(irq, apic, pin); - vector = assign_irq_vector(irq); + vector = assign_irq_vector(irq, NULL); if ( vector < 0 ) return vector; diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index b1c5d421f3..e75c06a3b6 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -151,7 +151,7 @@ int __init bind_irq_vector(int irq, int vector, const cpumask_t *cpu_mask) /* * Dynamic irq allocate and deallocation for MSI */ -int create_irq(void) +int create_irq(int node) { int irq, ret; struct irq_desc *desc; @@ -168,7 +168,17 @@ int create_irq(void) ret = init_one_irq_desc(desc); if (!ret) - ret = assign_irq_vector(irq); + { + cpumask_t *mask = NULL; + + if (node != NUMA_NO_NODE && node >= 0) + { + mask = &node_to_cpumask(node); + if (cpumask_empty(mask)) + mask = NULL; + } + ret = assign_irq_vector(irq, mask); + } if (ret < 0) { desc->arch.used = IRQ_UNUSED; @@ -514,7 +524,7 @@ next: return err; } -int assign_irq_vector(int irq) +int assign_irq_vector(int irq, const cpumask_t *mask) { int ret; unsigned long flags; @@ -523,7 +533,7 @@ int assign_irq_vector(int irq) BUG_ON(irq >= nr_irqs || irq <0); spin_lock_irqsave(&vector_lock, flags); - ret = __assign_irq_vector(irq, desc, TARGET_CPUS); + ret = __assign_irq_vector(irq, desc, mask ?: TARGET_CPUS); if (!ret) { ret = desc->arch.vector; cpumask_copy(desc->affinity, desc->arch.cpu_mask); diff --git a/xen/arch/x86/physdev.c b/xen/arch/x86/physdev.c index 5a4acaef69..c1c7e54da6 100644 --- a/xen/arch/x86/physdev.c +++ b/xen/arch/x86/physdev.c @@ -132,7 +132,7 @@ int physdev_map_pirq(domid_t domid, int type, int *index, int *pirq_p, case MAP_PIRQ_TYPE_MSI: irq = *index; if ( irq == -1 ) - irq = create_irq(); + irq = create_irq(NUMA_NO_NODE); if ( irq < 0 || irq >= nr_irqs ) { |