All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86/IRQ: eliminate irq_vector[]
@ 2011-11-08 10:36 Jan Beulich
  2011-11-08 12:17 ` Andrew Cooper
  2011-11-08 15:40 ` Keir Fraser
  0 siblings, 2 replies; 3+ messages in thread
From: Jan Beulich @ 2011-11-08 10:36 UTC (permalink / raw)
  To: xen-devel@lists.xensource.com

[-- Attachment #1: Type: text/plain, Size: 7155 bytes --]

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>

--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -452,10 +452,10 @@ static void unmask_IO_APIC_irq(struct ir
     spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
-static void __eoi_IO_APIC_irq(unsigned int irq)
+static void __eoi_IO_APIC_irq(struct irq_desc *desc)
 {
-    struct irq_pin_list *entry = irq_2_pin + irq;
-    unsigned int pin, vector = IO_APIC_VECTOR(irq);
+    struct irq_pin_list *entry = irq_2_pin + desc->irq;
+    unsigned int pin, vector = desc->arch.vector;
 
     for (;;) {
         pin = entry->pin;
@@ -468,11 +468,11 @@ static void __eoi_IO_APIC_irq(unsigned i
     }
 }
 
-static void eoi_IO_APIC_irq(unsigned int irq)
+static void eoi_IO_APIC_irq(struct irq_desc *desc)
 {
     unsigned long flags;
     spin_lock_irqsave(&ioapic_lock, flags);
-    __eoi_IO_APIC_irq(irq);
+    __eoi_IO_APIC_irq(desc);
     spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
@@ -1200,7 +1200,7 @@ static void /*__init*/ __print_IO_APIC(v
         struct irq_pin_list *entry = irq_2_pin + i;
         if (entry->pin < 0)
             continue;
-        printk(KERN_DEBUG "IRQ%d ", IO_APIC_VECTOR(i));
+        printk(KERN_DEBUG "IRQ%d ", irq_to_desc(i)->arch.vector);
         for (;;) {
             printk("-> %d:%d", entry->apic, entry->pin);
             if (!entry->next)
@@ -1621,7 +1621,7 @@ static void mask_and_ack_level_ioapic_ir
  * operation to prevent an edge-triggered interrupt escaping meanwhile.
  * The idea is from Manfred Spraul.  --macro
  */
-    i = IO_APIC_VECTOR(desc->irq);
+    i = desc->arch.vector;
 
     v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
 
@@ -1653,12 +1653,12 @@ static void end_level_ioapic_irq(struct 
         {
             if ( !(desc->status & (IRQ_DISABLED|IRQ_MOVE_PENDING)) )
             {
-                eoi_IO_APIC_irq(desc->irq);
+                eoi_IO_APIC_irq(desc);
                 return;
             }
 
             mask_IO_APIC_irq(desc);
-            eoi_IO_APIC_irq(desc->irq);
+            eoi_IO_APIC_irq(desc);
             if ( (desc->status & IRQ_MOVE_PENDING) &&
                  !io_apic_level_ack_pending(desc->irq) )
                 move_masked_irq(desc);
@@ -1689,7 +1689,7 @@ static void end_level_ioapic_irq(struct 
  * operation to prevent an edge-triggered interrupt escaping meanwhile.
  * The idea is from Manfred Spraul.  --macro
  */
-    i = IO_APIC_VECTOR(desc->irq);
+    i = desc->arch.vector;
 
     /* Manually EOI the old vector if we are moving to the new */
     if ( vector && i != vector )
@@ -1752,7 +1752,7 @@ static inline void init_IO_APIC_traps(vo
     int irq;
     /* Xen: This is way simpler than the Linux implementation. */
     for (irq = 0; platform_legacy_irq(irq); irq++)
-        if (IO_APIC_IRQ(irq) && !IO_APIC_VECTOR(irq))
+        if (IO_APIC_IRQ(irq) && !irq_to_vector(irq))
             make_8259A_irq(irq);
 }
 
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -41,7 +41,6 @@ custom_param("irq_vector_map", parse_irq
 
 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);
@@ -135,8 +134,6 @@ static int __init __bind_irq_vector(int 
         set_bit(vector, desc->arch.used_vectors);
     }
     desc->arch.used = IRQ_USED;
-    if (IO_APIC_IRQ(irq))
-        irq_vector[irq] = vector;
     return 0;
 }
 
@@ -289,7 +286,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
@@ -331,9 +332,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++) {
@@ -426,7 +426,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;
@@ -485,7 +485,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;
@@ -501,9 +501,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));
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -998,7 +998,7 @@ void __init smp_intr_init(void)
      * IRQ0 must be given a fixed assignment and initialized,
      * because it's used before the IO-APIC is set up.
      */
-    irq_vector[0] = FIRST_HIPRIORITY_VECTOR;
+    irq_to_desc(0)->arch.vector = FIRST_HIPRIORITY_VECTOR;
 
     /*
      * Also ensure serial interrupts are high priority. We do not
@@ -1008,7 +1008,6 @@ void __init smp_intr_init(void)
     {
         if ( (irq = serial_irq(seridx)) < 0 )
             continue;
-        irq_vector[irq] = FIRST_HIPRIORITY_VECTOR + seridx + 1;
         per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] = irq;
         irq_to_desc(irq)->arch.vector = FIRST_HIPRIORITY_VECTOR + seridx + 1;
         cpumask_copy(irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
--- a/xen/include/asm-x86/irq.h
+++ b/xen/include/asm-x86/irq.h
@@ -14,7 +14,6 @@
 #define IO_APIC_IRQ(irq)    (platform_legacy_irq(irq) ?    \
 			     (1 << (irq)) & io_apic_irqs : \
 			     (irq) < nr_irqs_gsi)
-#define IO_APIC_VECTOR(irq) (irq_vector[irq])
 
 #define MSI_IRQ(irq)       ((irq) >= nr_irqs_gsi && (irq) < nr_irqs)
 
@@ -48,8 +47,6 @@ struct arch_irq_desc {
 typedef int vector_irq_t[NR_VECTORS];
 DECLARE_PER_CPU(vector_irq_t, vector_irq);
 
-extern u8 *irq_vector;
-
 extern bool_t opt_noirqbalance;
 
 #define OPT_IRQ_VECTOR_MAP_DEFAULT 0 /* Do the default thing  */



[-- Attachment #2: x86-no-irq_vector.patch --]
[-- Type: text/plain, Size: 7186 bytes --]

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>

--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -452,10 +452,10 @@ static void unmask_IO_APIC_irq(struct ir
     spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
-static void __eoi_IO_APIC_irq(unsigned int irq)
+static void __eoi_IO_APIC_irq(struct irq_desc *desc)
 {
-    struct irq_pin_list *entry = irq_2_pin + irq;
-    unsigned int pin, vector = IO_APIC_VECTOR(irq);
+    struct irq_pin_list *entry = irq_2_pin + desc->irq;
+    unsigned int pin, vector = desc->arch.vector;
 
     for (;;) {
         pin = entry->pin;
@@ -468,11 +468,11 @@ static void __eoi_IO_APIC_irq(unsigned i
     }
 }
 
-static void eoi_IO_APIC_irq(unsigned int irq)
+static void eoi_IO_APIC_irq(struct irq_desc *desc)
 {
     unsigned long flags;
     spin_lock_irqsave(&ioapic_lock, flags);
-    __eoi_IO_APIC_irq(irq);
+    __eoi_IO_APIC_irq(desc);
     spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
@@ -1200,7 +1200,7 @@ static void /*__init*/ __print_IO_APIC(v
         struct irq_pin_list *entry = irq_2_pin + i;
         if (entry->pin < 0)
             continue;
-        printk(KERN_DEBUG "IRQ%d ", IO_APIC_VECTOR(i));
+        printk(KERN_DEBUG "IRQ%d ", irq_to_desc(i)->arch.vector);
         for (;;) {
             printk("-> %d:%d", entry->apic, entry->pin);
             if (!entry->next)
@@ -1621,7 +1621,7 @@ static void mask_and_ack_level_ioapic_ir
  * operation to prevent an edge-triggered interrupt escaping meanwhile.
  * The idea is from Manfred Spraul.  --macro
  */
-    i = IO_APIC_VECTOR(desc->irq);
+    i = desc->arch.vector;
 
     v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
 
@@ -1653,12 +1653,12 @@ static void end_level_ioapic_irq(struct 
         {
             if ( !(desc->status & (IRQ_DISABLED|IRQ_MOVE_PENDING)) )
             {
-                eoi_IO_APIC_irq(desc->irq);
+                eoi_IO_APIC_irq(desc);
                 return;
             }
 
             mask_IO_APIC_irq(desc);
-            eoi_IO_APIC_irq(desc->irq);
+            eoi_IO_APIC_irq(desc);
             if ( (desc->status & IRQ_MOVE_PENDING) &&
                  !io_apic_level_ack_pending(desc->irq) )
                 move_masked_irq(desc);
@@ -1689,7 +1689,7 @@ static void end_level_ioapic_irq(struct 
  * operation to prevent an edge-triggered interrupt escaping meanwhile.
  * The idea is from Manfred Spraul.  --macro
  */
-    i = IO_APIC_VECTOR(desc->irq);
+    i = desc->arch.vector;
 
     /* Manually EOI the old vector if we are moving to the new */
     if ( vector && i != vector )
@@ -1752,7 +1752,7 @@ static inline void init_IO_APIC_traps(vo
     int irq;
     /* Xen: This is way simpler than the Linux implementation. */
     for (irq = 0; platform_legacy_irq(irq); irq++)
-        if (IO_APIC_IRQ(irq) && !IO_APIC_VECTOR(irq))
+        if (IO_APIC_IRQ(irq) && !irq_to_vector(irq))
             make_8259A_irq(irq);
 }
 
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -41,7 +41,6 @@ custom_param("irq_vector_map", parse_irq
 
 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);
@@ -135,8 +134,6 @@ static int __init __bind_irq_vector(int 
         set_bit(vector, desc->arch.used_vectors);
     }
     desc->arch.used = IRQ_USED;
-    if (IO_APIC_IRQ(irq))
-        irq_vector[irq] = vector;
     return 0;
 }
 
@@ -289,7 +286,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
@@ -331,9 +332,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++) {
@@ -426,7 +426,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;
@@ -485,7 +485,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;
@@ -501,9 +501,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));
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -998,7 +998,7 @@ void __init smp_intr_init(void)
      * IRQ0 must be given a fixed assignment and initialized,
      * because it's used before the IO-APIC is set up.
      */
-    irq_vector[0] = FIRST_HIPRIORITY_VECTOR;
+    irq_to_desc(0)->arch.vector = FIRST_HIPRIORITY_VECTOR;
 
     /*
      * Also ensure serial interrupts are high priority. We do not
@@ -1008,7 +1008,6 @@ void __init smp_intr_init(void)
     {
         if ( (irq = serial_irq(seridx)) < 0 )
             continue;
-        irq_vector[irq] = FIRST_HIPRIORITY_VECTOR + seridx + 1;
         per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] = irq;
         irq_to_desc(irq)->arch.vector = FIRST_HIPRIORITY_VECTOR + seridx + 1;
         cpumask_copy(irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
--- a/xen/include/asm-x86/irq.h
+++ b/xen/include/asm-x86/irq.h
@@ -14,7 +14,6 @@
 #define IO_APIC_IRQ(irq)    (platform_legacy_irq(irq) ?    \
 			     (1 << (irq)) & io_apic_irqs : \
 			     (irq) < nr_irqs_gsi)
-#define IO_APIC_VECTOR(irq) (irq_vector[irq])
 
 #define MSI_IRQ(irq)       ((irq) >= nr_irqs_gsi && (irq) < nr_irqs)
 
@@ -48,8 +47,6 @@ struct arch_irq_desc {
 typedef int vector_irq_t[NR_VECTORS];
 DECLARE_PER_CPU(vector_irq_t, vector_irq);
 
-extern u8 *irq_vector;
-
 extern bool_t opt_noirqbalance;
 
 #define OPT_IRQ_VECTOR_MAP_DEFAULT 0 /* Do the default thing  */

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] x86/IRQ: eliminate irq_vector[]
  2011-11-08 10:36 [PATCH] x86/IRQ: eliminate irq_vector[] Jan Beulich
@ 2011-11-08 12:17 ` Andrew Cooper
  2011-11-08 15:40 ` Keir Fraser
  1 sibling, 0 replies; 3+ messages in thread
From: Andrew Cooper @ 2011-11-08 12:17 UTC (permalink / raw)
  To: Jan Beulich; +Cc: xen-devel@lists.xensource.com

On 08/11/11 10:36, Jan Beulich wrote:
> 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>

Seems you have beaten me to this.  I had an untested patch to remove
irq_vector but this is much cleaner.

Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>

> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -452,10 +452,10 @@ static void unmask_IO_APIC_irq(struct ir
>      spin_unlock_irqrestore(&ioapic_lock, flags);
>  }
>  
> -static void __eoi_IO_APIC_irq(unsigned int irq)
> +static void __eoi_IO_APIC_irq(struct irq_desc *desc)
>  {
> -    struct irq_pin_list *entry = irq_2_pin + irq;
> -    unsigned int pin, vector = IO_APIC_VECTOR(irq);
> +    struct irq_pin_list *entry = irq_2_pin + desc->irq;
> +    unsigned int pin, vector = desc->arch.vector;
>  
>      for (;;) {
>          pin = entry->pin;
> @@ -468,11 +468,11 @@ static void __eoi_IO_APIC_irq(unsigned i
>      }
>  }
>  
> -static void eoi_IO_APIC_irq(unsigned int irq)
> +static void eoi_IO_APIC_irq(struct irq_desc *desc)
>  {
>      unsigned long flags;
>      spin_lock_irqsave(&ioapic_lock, flags);
> -    __eoi_IO_APIC_irq(irq);
> +    __eoi_IO_APIC_irq(desc);
>      spin_unlock_irqrestore(&ioapic_lock, flags);
>  }
>  
> @@ -1200,7 +1200,7 @@ static void /*__init*/ __print_IO_APIC(v
>          struct irq_pin_list *entry = irq_2_pin + i;
>          if (entry->pin < 0)
>              continue;
> -        printk(KERN_DEBUG "IRQ%d ", IO_APIC_VECTOR(i));
> +        printk(KERN_DEBUG "IRQ%d ", irq_to_desc(i)->arch.vector);
>          for (;;) {
>              printk("-> %d:%d", entry->apic, entry->pin);
>              if (!entry->next)
> @@ -1621,7 +1621,7 @@ static void mask_and_ack_level_ioapic_ir
>   * operation to prevent an edge-triggered interrupt escaping meanwhile.
>   * The idea is from Manfred Spraul.  --macro
>   */
> -    i = IO_APIC_VECTOR(desc->irq);
> +    i = desc->arch.vector;
>  
>      v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
>  
> @@ -1653,12 +1653,12 @@ static void end_level_ioapic_irq(struct 
>          {
>              if ( !(desc->status & (IRQ_DISABLED|IRQ_MOVE_PENDING)) )
>              {
> -                eoi_IO_APIC_irq(desc->irq);
> +                eoi_IO_APIC_irq(desc);
>                  return;
>              }
>  
>              mask_IO_APIC_irq(desc);
> -            eoi_IO_APIC_irq(desc->irq);
> +            eoi_IO_APIC_irq(desc);
>              if ( (desc->status & IRQ_MOVE_PENDING) &&
>                   !io_apic_level_ack_pending(desc->irq) )
>                  move_masked_irq(desc);
> @@ -1689,7 +1689,7 @@ static void end_level_ioapic_irq(struct 
>   * operation to prevent an edge-triggered interrupt escaping meanwhile.
>   * The idea is from Manfred Spraul.  --macro
>   */
> -    i = IO_APIC_VECTOR(desc->irq);
> +    i = desc->arch.vector;
>  
>      /* Manually EOI the old vector if we are moving to the new */
>      if ( vector && i != vector )
> @@ -1752,7 +1752,7 @@ static inline void init_IO_APIC_traps(vo
>      int irq;
>      /* Xen: This is way simpler than the Linux implementation. */
>      for (irq = 0; platform_legacy_irq(irq); irq++)
> -        if (IO_APIC_IRQ(irq) && !IO_APIC_VECTOR(irq))
> +        if (IO_APIC_IRQ(irq) && !irq_to_vector(irq))
>              make_8259A_irq(irq);
>  }
>  
> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -41,7 +41,6 @@ custom_param("irq_vector_map", parse_irq
>  
>  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);
> @@ -135,8 +134,6 @@ static int __init __bind_irq_vector(int 
>          set_bit(vector, desc->arch.used_vectors);
>      }
>      desc->arch.used = IRQ_USED;
> -    if (IO_APIC_IRQ(irq))
> -        irq_vector[irq] = vector;
>      return 0;
>  }
>  
> @@ -289,7 +286,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
> @@ -331,9 +332,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++) {
> @@ -426,7 +426,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;
> @@ -485,7 +485,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;
> @@ -501,9 +501,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));
> --- a/xen/arch/x86/smpboot.c
> +++ b/xen/arch/x86/smpboot.c
> @@ -998,7 +998,7 @@ void __init smp_intr_init(void)
>       * IRQ0 must be given a fixed assignment and initialized,
>       * because it's used before the IO-APIC is set up.
>       */
> -    irq_vector[0] = FIRST_HIPRIORITY_VECTOR;
> +    irq_to_desc(0)->arch.vector = FIRST_HIPRIORITY_VECTOR;
>  
>      /*
>       * Also ensure serial interrupts are high priority. We do not
> @@ -1008,7 +1008,6 @@ void __init smp_intr_init(void)
>      {
>          if ( (irq = serial_irq(seridx)) < 0 )
>              continue;
> -        irq_vector[irq] = FIRST_HIPRIORITY_VECTOR + seridx + 1;
>          per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] = irq;
>          irq_to_desc(irq)->arch.vector = FIRST_HIPRIORITY_VECTOR + seridx + 1;
>          cpumask_copy(irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
> --- a/xen/include/asm-x86/irq.h
> +++ b/xen/include/asm-x86/irq.h
> @@ -14,7 +14,6 @@
>  #define IO_APIC_IRQ(irq)    (platform_legacy_irq(irq) ?    \
>  			     (1 << (irq)) & io_apic_irqs : \
>  			     (irq) < nr_irqs_gsi)
> -#define IO_APIC_VECTOR(irq) (irq_vector[irq])
>  
>  #define MSI_IRQ(irq)       ((irq) >= nr_irqs_gsi && (irq) < nr_irqs)
>  
> @@ -48,8 +47,6 @@ struct arch_irq_desc {
>  typedef int vector_irq_t[NR_VECTORS];
>  DECLARE_PER_CPU(vector_irq_t, vector_irq);
>  
> -extern u8 *irq_vector;
> -
>  extern bool_t opt_noirqbalance;
>  
>  #define OPT_IRQ_VECTOR_MAP_DEFAULT 0 /* Do the default thing  */
>
>

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] x86/IRQ: eliminate irq_vector[]
  2011-11-08 10:36 [PATCH] x86/IRQ: eliminate irq_vector[] Jan Beulich
  2011-11-08 12:17 ` Andrew Cooper
@ 2011-11-08 15:40 ` Keir Fraser
  1 sibling, 0 replies; 3+ messages in thread
From: Keir Fraser @ 2011-11-08 15:40 UTC (permalink / raw)
  To: Jan Beulich, xen-devel@lists.xensource.com

On 08/11/2011 10:36, "Jan Beulich" <JBeulich@suse.com> wrote:

> 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>

> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -452,10 +452,10 @@ static void unmask_IO_APIC_irq(struct ir
>      spin_unlock_irqrestore(&ioapic_lock, flags);
>  }
>  
> -static void __eoi_IO_APIC_irq(unsigned int irq)
> +static void __eoi_IO_APIC_irq(struct irq_desc *desc)
>  {
> -    struct irq_pin_list *entry = irq_2_pin + irq;
> -    unsigned int pin, vector = IO_APIC_VECTOR(irq);
> +    struct irq_pin_list *entry = irq_2_pin + desc->irq;
> +    unsigned int pin, vector = desc->arch.vector;
>  
>      for (;;) {
>          pin = entry->pin;
> @@ -468,11 +468,11 @@ static void __eoi_IO_APIC_irq(unsigned i
>      }
>  }
>  
> -static void eoi_IO_APIC_irq(unsigned int irq)
> +static void eoi_IO_APIC_irq(struct irq_desc *desc)
>  {
>      unsigned long flags;
>      spin_lock_irqsave(&ioapic_lock, flags);
> -    __eoi_IO_APIC_irq(irq);
> +    __eoi_IO_APIC_irq(desc);
>      spin_unlock_irqrestore(&ioapic_lock, flags);
>  }
>  
> @@ -1200,7 +1200,7 @@ static void /*__init*/ __print_IO_APIC(v
>          struct irq_pin_list *entry = irq_2_pin + i;
>          if (entry->pin < 0)
>              continue;
> -        printk(KERN_DEBUG "IRQ%d ", IO_APIC_VECTOR(i));
> +        printk(KERN_DEBUG "IRQ%d ", irq_to_desc(i)->arch.vector);
>          for (;;) {
>              printk("-> %d:%d", entry->apic, entry->pin);
>              if (!entry->next)
> @@ -1621,7 +1621,7 @@ static void mask_and_ack_level_ioapic_ir
>   * operation to prevent an edge-triggered interrupt escaping meanwhile.
>   * The idea is from Manfred Spraul.  --macro
>   */
> -    i = IO_APIC_VECTOR(desc->irq);
> +    i = desc->arch.vector;
>  
>      v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
>  
> @@ -1653,12 +1653,12 @@ static void end_level_ioapic_irq(struct
>          {
>              if ( !(desc->status & (IRQ_DISABLED|IRQ_MOVE_PENDING)) )
>              {
> -                eoi_IO_APIC_irq(desc->irq);
> +                eoi_IO_APIC_irq(desc);
>                  return;
>              }
>  
>              mask_IO_APIC_irq(desc);
> -            eoi_IO_APIC_irq(desc->irq);
> +            eoi_IO_APIC_irq(desc);
>              if ( (desc->status & IRQ_MOVE_PENDING) &&
>                   !io_apic_level_ack_pending(desc->irq) )
>                  move_masked_irq(desc);
> @@ -1689,7 +1689,7 @@ static void end_level_ioapic_irq(struct
>   * operation to prevent an edge-triggered interrupt escaping meanwhile.
>   * The idea is from Manfred Spraul.  --macro
>   */
> -    i = IO_APIC_VECTOR(desc->irq);
> +    i = desc->arch.vector;
>  
>      /* Manually EOI the old vector if we are moving to the new */
>      if ( vector && i != vector )
> @@ -1752,7 +1752,7 @@ static inline void init_IO_APIC_traps(vo
>      int irq;
>      /* Xen: This is way simpler than the Linux implementation. */
>      for (irq = 0; platform_legacy_irq(irq); irq++)
> -        if (IO_APIC_IRQ(irq) && !IO_APIC_VECTOR(irq))
> +        if (IO_APIC_IRQ(irq) && !irq_to_vector(irq))
>              make_8259A_irq(irq);
>  }
>  
> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -41,7 +41,6 @@ custom_param("irq_vector_map", parse_irq
>  
>  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);
> @@ -135,8 +134,6 @@ static int __init __bind_irq_vector(int
>          set_bit(vector, desc->arch.used_vectors);
>      }
>      desc->arch.used = IRQ_USED;
> -    if (IO_APIC_IRQ(irq))
> -        irq_vector[irq] = vector;
>      return 0;
>  }
>  
> @@ -289,7 +286,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
> @@ -331,9 +332,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++) {
> @@ -426,7 +426,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;
> @@ -485,7 +485,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;
> @@ -501,9 +501,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));
> --- a/xen/arch/x86/smpboot.c
> +++ b/xen/arch/x86/smpboot.c
> @@ -998,7 +998,7 @@ void __init smp_intr_init(void)
>       * IRQ0 must be given a fixed assignment and initialized,
>       * because it's used before the IO-APIC is set up.
>       */
> -    irq_vector[0] = FIRST_HIPRIORITY_VECTOR;
> +    irq_to_desc(0)->arch.vector = FIRST_HIPRIORITY_VECTOR;
>  
>      /*
>       * Also ensure serial interrupts are high priority. We do not
> @@ -1008,7 +1008,6 @@ void __init smp_intr_init(void)
>      {
>          if ( (irq = serial_irq(seridx)) < 0 )
>              continue;
> -        irq_vector[irq] = FIRST_HIPRIORITY_VECTOR + seridx + 1;
>          per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] = irq;
>          irq_to_desc(irq)->arch.vector = FIRST_HIPRIORITY_VECTOR + seridx + 1;
>          cpumask_copy(irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
> --- a/xen/include/asm-x86/irq.h
> +++ b/xen/include/asm-x86/irq.h
> @@ -14,7 +14,6 @@
>  #define IO_APIC_IRQ(irq)    (platform_legacy_irq(irq) ?    \
>     (1 << (irq)) & io_apic_irqs : \
>     (irq) < nr_irqs_gsi)
> -#define IO_APIC_VECTOR(irq) (irq_vector[irq])
>  
>  #define MSI_IRQ(irq)       ((irq) >= nr_irqs_gsi && (irq) < nr_irqs)
>  
> @@ -48,8 +47,6 @@ struct arch_irq_desc {
>  typedef int vector_irq_t[NR_VECTORS];
>  DECLARE_PER_CPU(vector_irq_t, vector_irq);
>  
> -extern u8 *irq_vector;
> -
>  extern bool_t opt_noirqbalance;
>  
>  #define OPT_IRQ_VECTOR_MAP_DEFAULT 0 /* Do the default thing  */
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-11-08 15:40 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-08 10:36 [PATCH] x86/IRQ: eliminate irq_vector[] Jan Beulich
2011-11-08 12:17 ` Andrew Cooper
2011-11-08 15:40 ` Keir Fraser

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.