aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2013-04-09 16:10:29 +0200
committerJan Beulich <jbeulich@suse.com>2013-04-09 16:10:29 +0200
commitd7d4d16afe2460a4e988ba237ec44c7fc36b7b1f (patch)
tree26f89030744df329fee37962524c14e9079ec65a
parentb10b4af626d95cd432576cad0e2f500769c1e002 (diff)
downloadxen-d7d4d16afe2460a4e988ba237ec44c7fc36b7b1f.tar.gz
xen-d7d4d16afe2460a4e988ba237ec44c7fc36b7b1f.tar.bz2
xen-d7d4d16afe2460a4e988ba237ec44c7fc36b7b1f.zip
x86: irq_move_cleanup_interrupt() must ignore legacy vectors
Since the main loop in the function includes legacy vectors, and since vector_irq[] gets set up for legacy vectors regardless of whether those get handled through the IO-APIC, it must not do anything on this vector range. In fact, we should never get past the move_cleanup_count check for IRQs not handled through the IO-APIC. Adding a respective assertion woulkd make those iterations more expensive (due to the lock acquire). For such an assertion to not have false positives we however ought to suppress setting up IRQ2 as an 8259A interrupt (which wasn't correct anyway), which is being done here despite the assertion not actually getting added. Furthermore, there's no point iterating over the vectors past LAST_HIPRIORITY_VECTOR, so terminate the loop accordingly. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Keir Fraser <keir@xen.org> master commit: af699220ad6d111ba76fc3040342184e423cc9a1 master date: 2013-04-02 08:30:03 +0200
-rw-r--r--xen/arch/x86/i8259.c2
-rw-r--r--xen/arch/x86/io_apic.c7
2 files changed, 8 insertions, 1 deletions
diff --git a/xen/arch/x86/i8259.c b/xen/arch/x86/i8259.c
index 47d79717b3..b8d535fa83 100644
--- a/xen/arch/x86/i8259.c
+++ b/xen/arch/x86/i8259.c
@@ -395,6 +395,8 @@ void __init init_IRQ(void)
struct irq_desc *desc = irq_to_desc(irq);
struct irq_cfg *cfg = desc->chip_data;
+ if ( irq == 2 ) /* IRQ2 doesn't exist */
+ continue;
desc->handler = &i8259A_irq_type;
per_cpu(vector_irq, cpu)[FIRST_LEGACY_VECTOR + irq] = irq;
cfg->cpu_mask= cpumask_of_cpu(cpu);
diff --git a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c
index fb762b82c9..4378d8e4da 100644
--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -499,7 +499,9 @@ fastcall void smp_irq_move_cleanup_interrupt(struct cpu_user_regs *regs)
irq_enter();
me = smp_processor_id();
- for (vector = FIRST_DYNAMIC_VECTOR; vector < NR_VECTORS; vector++) {
+ for ( vector = FIRST_DYNAMIC_VECTOR;
+ vector <= LAST_HIPRIORITY_VECTOR; vector++)
+ {
unsigned int irq;
unsigned int irr;
struct irq_desc *desc;
@@ -509,6 +511,9 @@ fastcall void smp_irq_move_cleanup_interrupt(struct cpu_user_regs *regs)
if (irq == -1)
continue;
+ if ( vector >= FIRST_LEGACY_VECTOR && vector <= LAST_LEGACY_VECTOR )
+ continue;
+
desc = irq_to_desc(irq);
if (!desc)
continue;