aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/irq.c
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2011-11-11 09:47:40 +0100
committerJan Beulich <jbeulich@suse.com>2011-11-11 09:47:40 +0100
commite448617ff9b0cda46578437d0722b3377aa3877f (patch)
tree3aff325795b1b943302758eb68cccc5ea96e1f69 /xen/arch/x86/irq.c
parentc05b1a4186037d67b25767ee654560505232bfd7 (diff)
downloadxen-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.c19
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));