diff options
author | Jan Beulich <jbeulich@suse.com> | 2011-11-11 09:47:40 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2011-11-11 09:47:40 +0100 |
commit | e448617ff9b0cda46578437d0722b3377aa3877f (patch) | |
tree | 3aff325795b1b943302758eb68cccc5ea96e1f69 /xen/arch/x86/irq.c | |
parent | c05b1a4186037d67b25767ee654560505232bfd7 (diff) | |
download | xen-e448617ff9b0cda46578437d0722b3377aa3877f.tar.gz xen-e448617ff9b0cda46578437d0722b3377aa3877f.tar.bz2 xen-e448617ff9b0cda46578437d0722b3377aa3877f.zip |
x86/IRQ: eliminate irq_vector[]
The vector is already being tracked in struct irq_desc's arch.vector
member, so there's no real need for a second place where this to get
stored. The only caveat is that legacy vectors (used for interrupts
handled through the 8259) must be special cased to not prevent non-
legacy vectors from being assigned.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
Diffstat (limited to 'xen/arch/x86/irq.c')
-rw-r--r-- | xen/arch/x86/irq.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index eac9e7bc28..c525c51b8e 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -40,7 +40,6 @@ custom_param("irq_vector_map", parse_irq_vector_map_param); vmask_t global_used_vector_map; -u8 __read_mostly *irq_vector; struct irq_desc __read_mostly *irq_desc = NULL; static DECLARE_BITMAP(used_vectors, NR_VECTORS); @@ -134,8 +133,6 @@ static int __init __bind_irq_vector(int irq, int vector, const cpumask_t *cpu_ma set_bit(vector, desc->arch.used_vectors); } desc->arch.used = IRQ_USED; - if (IO_APIC_IRQ(irq)) - irq_vector[irq] = vector; return 0; } @@ -283,7 +280,11 @@ int irq_to_vector(int irq) BUG_ON(irq >= nr_irqs || irq < 0); if (IO_APIC_IRQ(irq)) - vector = irq_vector[irq]; + { + vector = irq_to_desc(irq)->arch.vector; + if (vector >= FIRST_LEGACY_VECTOR && vector <= LAST_LEGACY_VECTOR) + vector = 0; + } else if (MSI_IRQ(irq)) vector = irq_to_desc(irq)->arch.vector; else @@ -325,9 +326,8 @@ int __init init_irq_data(void) this_cpu(vector_irq)[vector] = -1; irq_desc = xzalloc_array(struct irq_desc, nr_irqs); - irq_vector = xzalloc_array(u8, nr_irqs_gsi); - if ( !irq_desc || !irq_vector ) + if ( !irq_desc ) return -ENOMEM; for (irq = 0; irq < nr_irqs_gsi; irq++) { @@ -420,7 +420,7 @@ static int __assign_irq_vector( vmask_t *irq_used_vectors = NULL; old_vector = irq_to_vector(irq); - if (old_vector) { + if (old_vector > 0) { cpumask_and(&tmp_mask, mask, &cpu_online_map); if (cpumask_intersects(&tmp_mask, desc->arch.cpu_mask)) { desc->arch.vector = old_vector; @@ -479,7 +479,7 @@ next: /* Found one! */ current_vector = vector; current_offset = offset; - if (old_vector) { + if (old_vector > 0) { desc->arch.move_in_progress = 1; cpumask_copy(desc->arch.old_cpu_mask, desc->arch.cpu_mask); desc->arch.old_vector = desc->arch.vector; @@ -495,9 +495,6 @@ next: || (desc->arch.used_vectors == irq_used_vectors)); desc->arch.used_vectors = irq_used_vectors; - if (IO_APIC_IRQ(irq)) - irq_vector[irq] = vector; - if ( desc->arch.used_vectors ) { ASSERT(!test_bit(vector, desc->arch.used_vectors)); |