]> xenbits.xensource.com Git - xen.git/commitdiff
x86: Unify direct-apic and hiprio irq vector allocations.
authorKeir Fraser <keir@xen.org>
Fri, 30 Mar 2012 09:01:15 +0000 (10:01 +0100)
committerKeir Fraser <keir@xen.org>
Fri, 30 Mar 2012 09:01:15 +0000 (10:01 +0100)
Signed-off-by: Keir Fraser <keir@xen.org>
xen/arch/x86/i8259.c
xen/arch/x86/io_apic.c
xen/arch/x86/irq.c
xen/arch/x86/smpboot.c
xen/include/asm-x86/irq.h
xen/include/asm-x86/mach-default/irq_vectors.h

index 3c7fca28f5242975d232198f37200e5fab356bc9..ee291d3edf357de0b7b13a6b2371060014b63ba1 100644 (file)
@@ -402,7 +402,7 @@ void __init init_IRQ(void)
         desc->arch.vector = FIRST_LEGACY_VECTOR + irq;
     }
     
-    per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR] = 0;
+    per_cpu(vector_irq, cpu)[IRQ0_VECTOR] = 0;
 
     apic_intr_init();
 
index 31f1541aea0581cea688d0f43ae8eaa96c1b09fd..72b32ce46b8e800039fef302e04262d320b6f002 100644 (file)
@@ -1856,7 +1856,7 @@ static void __init check_timer(void)
      * get/set the timer IRQ vector:
      */
     disable_8259A_irq(irq_to_desc(0));
-    vector = FIRST_HIPRIORITY_VECTOR;
+    vector = IRQ0_VECTOR;
     clear_irq_vector(0);
 
     cpumask_setall(&mask_all);
index 2e150bc05bc4ef960ea36ccf85ec899258c8802a..425af2038705e5807e519943bf8c64bb88c61852 100644 (file)
@@ -764,6 +764,14 @@ void pirq_set_affinity(struct domain *d, int pirq, const cpumask_t *mask)
 
 DEFINE_PER_CPU(unsigned int, irq_count);
 
+uint8_t alloc_hipriority_vector(void)
+{
+    static uint8_t next = FIRST_HIPRIORITY_VECTOR;
+    BUG_ON(next < FIRST_HIPRIORITY_VECTOR);
+    BUG_ON(next > LAST_HIPRIORITY_VECTOR);
+    return next++;
+}
+
 static void (*direct_apic_vector[NR_VECTORS])(struct cpu_user_regs *);
 void set_direct_apic_vector(
     uint8_t vector, void (*handler)(struct cpu_user_regs *))
@@ -775,14 +783,12 @@ void set_direct_apic_vector(
 void alloc_direct_apic_vector(
     uint8_t *vector, void (*handler)(struct cpu_user_regs *))
 {
-    static uint8_t next = LAST_HIPRIORITY_VECTOR;
     static DEFINE_SPINLOCK(lock);
 
     spin_lock(&lock);
     if (*vector == 0) {
-        BUG_ON(next == FIRST_HIPRIORITY_VECTOR);
-        set_direct_apic_vector(next, handler);
-        *vector = next--;
+        *vector = alloc_hipriority_vector();
+        set_direct_apic_vector(*vector, handler);
     }
     spin_unlock(&lock);
 }
index 41bc32fd1d7b9c411566386757dcf814c6cdc489..675ca451217c1cbb9ee98f4edf041d869c66071f 100644 (file)
@@ -1005,13 +1005,13 @@ void __init smp_cpus_done(void)
 
 void __init smp_intr_init(void)
 {
-    int irq, seridx, cpu = smp_processor_id();
+    int irq, vector, seridx, cpu = smp_processor_id();
 
     /*
      * IRQ0 must be given a fixed assignment and initialized,
      * because it's used before the IO-APIC is set up.
      */
-    irq_to_desc(0)->arch.vector = FIRST_HIPRIORITY_VECTOR;
+    irq_to_desc(0)->arch.vector = IRQ0_VECTOR;
 
     /*
      * Also ensure serial interrupts are high priority. We do not
@@ -1021,8 +1021,9 @@ void __init smp_intr_init(void)
     {
         if ( (irq = serial_irq(seridx)) < 0 )
             continue;
-        per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] = irq;
-        irq_to_desc(irq)->arch.vector = FIRST_HIPRIORITY_VECTOR + seridx + 1;
+        vector = alloc_hipriority_vector();
+        per_cpu(vector_irq, cpu)[vector] = irq;
+        irq_to_desc(irq)->arch.vector = vector;
         cpumask_copy(irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
     }
 
index 396f7ded826f5514226ebf550fd63151abc6c036..ffa3e8f2618f71e42f4aa5eb16207d02223f0e4f 100644 (file)
@@ -88,6 +88,8 @@ void pmu_apic_interrupt(struct cpu_user_regs *regs);
 void spurious_interrupt(struct cpu_user_regs *regs);
 void irq_move_cleanup_interrupt(struct cpu_user_regs *regs);
 
+uint8_t alloc_hipriority_vector(void);
+
 void set_direct_apic_vector(
     uint8_t vector, void (*handler)(struct cpu_user_regs *));
 void alloc_direct_apic_vector(
index 6b9cde66d1720c98bea03029f611d8801dfca363..992e00c44b5dbb68581d742067265a54322479f0 100644 (file)
  * High-priority dynamically-allocated vectors. For interrupts that
  * must be higher priority than any guest-bound interrupt.
  */
-#define FIRST_HIPRIORITY_VECTOR        0xf0
+#define FIRST_HIPRIORITY_VECTOR        0xf1
 #define LAST_HIPRIORITY_VECTOR  0xf8
+/* IRQ0 (timer) is statically allocated but must be high priority. */
+#define IRQ0_VECTOR             0xf0
 
 /* Legacy PIC uses vectors 0xe0-0xef. */
 #define FIRST_LEGACY_VECTOR    0xe0