properly distinguish irq and vector spaces
PATCH 1/3 properly distinguish irq and vector spaces
This makes sure that there are no assumptions about NR_IRQS==NR_VECTORS anymore, and it also renames various variables to properly reflect what they represent.
While coded correctly, I wonder whether dump_irqs() shouldn't interate over the vector space rather than the irq space, so that MSI entries are also processed.
ia64 build-tested only.
Signed-off-by Jan Beulich <[email protected]>
xen/arch/x86/i8259.c +1 -1
@@ -390,7 +390,7 @@ void __init init_IRQ(void)init_8259A (0 ); -for ( i =0 ; i <NR_IRQS ; i++ ) +for ( i =0 ; i <NR_VECTORS ; i++ ) { irq_desc[i].status =IRQ_DISABLED ; irq_desc[i].handler = &no_irq_type;
xen/arch/x86/io_apic.c +3 -13
@@ -1547,20 +1547,10 @@ static struct hw_interrupt_type ioapic_l .set_affinity = set_ioapic_affinity_vector, }; -static void mask_msi_vector (unsigned int vector) -{ -mask_msi_irq (vector); -} - -static void unmask_msi_vector (unsigned int vector) -{ -unmask_msi_irq (vector); -} -static unsigned int startup_msi_vector (unsigned int vector) {dprintk (XENLOG_INFO ,"startup msi vector %x\n" , vector); -unmask_msi_irq (vector); +unmask_msi_vector (vector);return 0 ; }
@@ -1576,13 +1566,13 @@ static void end_msi_vector(unsigned intstatic void shutdown_msi_vector (unsigned int vector) {dprintk (XENLOG_INFO ,"shutdown msi vector %x\n" , vector); -mask_msi_irq (vector); +mask_msi_vector (vector); }static void set_msi_affinity_vector (unsigned int vector,cpumask_t cpu_mask) {set_native_irq_info (vector, cpu_mask); -set_msi_irq_affinity (vector, cpu_mask); +set_msi_affinity (vector, cpu_mask); }/*
xen/arch/x86/irq.c +16 -14
@@ -24,7 +24,7 @@int opt_noirqbalance =0 ;boolean_param ("noirqbalance" , opt_noirqbalance); -irq_desc_t irq_desc[NR_IRQS ]; +irq_desc_t irq_desc[NR_VECTORS ];static void __do_IRQ_guest (int vector);
@@ -206,7 +206,7 @@ struct pending_eoi { static DEFINE_PER_CPU(struct pending_eoi, pending_eoi[NR_VECTORS]);#define pending_eoi_sp (p) ((p)[NR_VECTORS-1].vector) -static struct timer irq_guest_eoi_timer[NR_IRQS ]; +static struct timer irq_guest_eoi_timer[NR_VECTORS ];static void irq_guest_eoi_timer_fn (void *data) {irq_desc_t *desc = data;
@@ -1006,28 +1006,30 @@ __initcall(setup_dump_irqs);void fixup_irqs (cpumask_t map) { -unsigned int irq, sp; +unsigned int vector, sp;static int warned;irq_guest_action_t *action;struct pending_eoi *peoi;/* Direct all future interrupts away from this CPU. */ -for ( irq =0 ; irq <NR_IRQS ; irq++ ) +for ( vector =0 ; vector <NR_VECTORS ; vector++ ) {cpumask_t mask; -if ( irq ==2 ) +if (vector_to_irq (vector) ==2 )continue ; -cpus_and (mask, irq_desc[irq].affinity, map); +cpus_and (mask, irq_desc[vector].affinity, map);if (any_online_cpu (mask) ==NR_CPUS ) { -printk ("Breaking affinity for irq %i\n" , irq); +printk ("Breaking affinity for vector %u (irq %i)\n" , + vector,vector_to_irq (vector)); mask = map; } -if ( irq_desc[irq].handler->set_affinity ) - irq_desc[irq].handler->set_affinity (irq, mask); -else if ( irq_desc[irq].action && !(warned++) ) -printk ("Cannot set affinity for irq %i\n" , irq); +if ( irq_desc[vector].handler->set_affinity ) + irq_desc[vector].handler->set_affinity (vector, mask); +else if ( irq_desc[vector].action && !(warned++) ) +printk ("Cannot set affinity for irq %u (irq %i)\n" , + vector,vector_to_irq (vector)); }/* Service any interrupts that beat us in the re-direction race. */
@@ -1036,11 +1038,11 @@ void fixup_irqs(cpumask_t map)local_irq_disable ();/* Clean up cpu_eoi_map of every interrupt to exclude this CPU. */ -for ( irq =0 ; irq <NR_IRQS ; irq++ ) +for ( vector =0 ; vector <NR_VECTORS ; vector++ ) { -if ( !(irq_desc[irq].status &IRQ_GUEST ) ) +if ( !(irq_desc[vector].status &IRQ_GUEST ) )continue ; - action = (irq_guest_action_t *)irq_desc[irq].action; + action = (irq_guest_action_t *)irq_desc[vector].action;cpu_clear (smp_processor_id (), action->cpu_eoi_map); }
xen/arch/x86/msi.c +14 -14
@@ -212,9 +212,9 @@ static void write_msi_msg(struct msi_des entry->msg = *msg; } -void set_msi_irq_affinity (unsigned int irq,cpumask_t mask) +void set_msi_affinity (unsigned int vector,cpumask_t mask) { -struct msi_desc *desc = irq_desc[irq].msi_desc; +struct msi_desc *desc = irq_desc[vector].msi_desc;struct msi_msg msg;unsigned int dest;
@@ -227,7 +227,7 @@ void set_msi_irq_affinity(unsigned int iif ( !desc )return ; -ASSERT (spin_is_locked (&irq_desc[irq].lock)); +ASSERT (spin_is_locked (&irq_desc[vector].lock));spin_lock (&desc->dev->lock);read_msi_msg (desc, &msg);
@@ -276,9 +276,9 @@ static void msix_set_enable(struct pci_d } } -static void msix_flush_writes (unsigned int irq) +static void msix_flush_writes (unsigned int vector) { -struct msi_desc *entry = irq_desc[irq].msi_desc; +struct msi_desc *entry = irq_desc[vector].msi_desc;BUG_ON (!entry || !entry->dev);switch (entry->msi_attrib.type) {
@@ -305,11 +305,11 @@ int msi_maskable_irq(const struct msi_de || entry->msi_attrib.maskbit; } -static void msi_set_mask_bit (unsigned int irq,int flag) +static void msi_set_mask_bit (unsigned int vector,int flag) { -struct msi_desc *entry = irq_desc[irq].msi_desc; +struct msi_desc *entry = irq_desc[vector].msi_desc; -ASSERT (spin_is_locked (&irq_desc[irq].lock)); +ASSERT (spin_is_locked (&irq_desc[vector].lock));BUG_ON (!entry || !entry->dev);switch (entry->msi_attrib.type) {case PCI_CAP_ID_MSI :
@@ -342,16 +342,16 @@ static void msi_set_mask_bit(unsigned in entry->msi_attrib.masked = !!flag; } -void mask_msi_irq (unsigned int irq) +void mask_msi_vector (unsigned int vector) { -msi_set_mask_bit (irq,1 ); -msix_flush_writes (irq); +msi_set_mask_bit (vector,1 ); +msix_flush_writes (vector); } -void unmask_msi_irq (unsigned int irq) +void unmask_msi_vector (unsigned int vector) { -msi_set_mask_bit (irq,0 ); -msix_flush_writes (irq); +msi_set_mask_bit (vector,0 ); +msix_flush_writes (vector); }static struct msi_desc *alloc_msi_entry (void )
xen/include/asm-ia64/hvm/irq.h +0 -1
@@ -24,7 +24,6 @@#include <xen/irq.h> -#define NR_VECTORS 256#define VIOAPIC_NUM_PINS 48#include <xen/hvm/irq.h>
xen/include/asm-ia64/linux/asm/irq.h +1 -0
@@ -11,6 +11,7 @@* 02/29/00 D.Mosberger moved most things into hw_irq.h */ +#define NR_VECTORS 256#define NR_IRQS 256#define NR_IRQ_VECTORS NR_IRQS
xen/include/asm-x86/msi.h +3 -3
@@ -69,9 +69,9 @@ struct msi_msg { };/* Helper functions */ -extern void mask_msi_irq (unsigned int irq); -extern void unmask_msi_irq (unsigned int irq); -extern void set_msi_irq_affinity (unsigned int irq,cpumask_t mask); +extern void mask_msi_vector (unsigned int vector); +extern void unmask_msi_vector (unsigned int vector); +extern void set_msi_affinity (unsigned int vector,cpumask_t mask);extern int pci_enable_msi (struct msi_info *msi);extern void pci_disable_msi (int vector);extern void pci_cleanup_msi (struct pci_dev *pdev);
xen/include/xen/irq.h +7 -4
@@ -61,7 +61,7 @@ typedef struct {cpumask_t affinity; }__cacheline_aligned irq_desc_t; -extern irq_desc_t irq_desc[NR_IRQS ]; +extern irq_desc_t irq_desc[NR_VECTORS ];extern int setup_irq (unsigned int ,struct irqaction *);extern void free_irq (unsigned int );
@@ -81,13 +81,16 @@ extern void pirq_guest_unbind(struct domextern irq_desc_t *domain_spin_lock_irq_desc (struct domain *d,int irq,unsigned long *pflags); -static inline void set_native_irq_info (int irq,cpumask_t mask) +static inline void set_native_irq_info (unsigned int vector,cpumask_t mask) { - irq_desc[irq].affinity = mask; + irq_desc[vector].affinity = mask; } +#ifdef irq_to_vectorstatic inline void set_irq_info (int irq,cpumask_t mask) { -set_native_irq_info (irq, mask); +set_native_irq_info (irq_to_vector (irq), mask); } +#endif +#endif /* __XEN_IRQ_H__ */