From: "Jan Beulich" Subject: [PATCH 1/3] properly distinguish irq and vector spaces Date: Thu, 20 Nov 2008 13:45:36 +0000 Message-ID: <49257810.76E4.0078.0@novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org This makes sure that there are no assumptions about NR_IRQS=3D=3DNR_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 Index: 2008-11-20/xen/arch/x86/i8259.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 2008-11-20.orig/xen/arch/x86/i8259.c 2008-11-20 10:55:17.0000000= 00 +0100 +++ 2008-11-20/xen/arch/x86/i8259.c 2008-11-20 08:47:05.000000000 = +0100 @@ -390,7 +390,7 @@ void __init init_IRQ(void) =20 init_8259A(0); =20 - for ( i =3D 0; i < NR_IRQS; i++ ) + for ( i =3D 0; i < NR_VECTORS; i++ ) { irq_desc[i].status =3D IRQ_DISABLED; irq_desc[i].handler =3D &no_irq_type; Index: 2008-11-20/xen/arch/x86/io_apic.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 2008-11-20.orig/xen/arch/x86/io_apic.c 2008-11-20 10:55:17.0000000= 00 +0100 +++ 2008-11-20/xen/arch/x86/io_apic.c 2008-11-20 08:47:05.000000000 = +0100 @@ -1547,20 +1547,10 @@ static struct hw_interrupt_type ioapic_l .set_affinity =3D set_ioapic_affinity_vector, }; =20 -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; } =20 @@ -1576,13 +1566,13 @@ static void end_msi_vector(unsigned int=20 static void shutdown_msi_vector(unsigned int vector) { dprintk(XENLOG_INFO, "shutdown msi vector %x\n", vector); - mask_msi_irq(vector); + mask_msi_vector(vector); } =20 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); } =20 /* Index: 2008-11-20/xen/arch/x86/irq.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 2008-11-20.orig/xen/arch/x86/irq.c 2008-11-20 10:55:17.000000000 = +0100 +++ 2008-11-20/xen/arch/x86/irq.c 2008-11-20 08:47:05.000000000 = +0100 @@ -24,7 +24,7 @@ int opt_noirqbalance =3D 0; boolean_param("noirqbalance", opt_noirqbalance); =20 -irq_desc_t irq_desc[NR_IRQS]; +irq_desc_t irq_desc[NR_VECTORS]; =20 static void __do_IRQ_guest(int vector); =20 @@ -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) =20 -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 =3D data; @@ -1006,28 +1006,30 @@ __initcall(setup_dump_irqs); =20 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; =20 /* Direct all future interrupts away from this CPU. */ - for ( irq =3D 0; irq < NR_IRQS; irq++ ) + for ( vector =3D 0; vector < NR_VECTORS; vector++ ) { cpumask_t mask; - if ( irq =3D=3D 2 ) + if ( vector_to_irq(vector) =3D=3D 2 ) continue; =20 - cpus_and(mask, irq_desc[irq].affinity, map); + cpus_and(mask, irq_desc[vector].affinity, map); if ( any_online_cpu(mask) =3D=3D 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 =3D 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)); } =20 /* Service any interrupts that beat us in the re-direction race. */ @@ -1036,11 +1038,11 @@ void fixup_irqs(cpumask_t map) local_irq_disable(); =20 /* Clean up cpu_eoi_map of every interrupt to exclude this CPU. */ - for ( irq =3D 0; irq < NR_IRQS; irq++ ) + for ( vector =3D 0; vector < NR_VECTORS; vector++ ) { - if ( !(irq_desc[irq].status & IRQ_GUEST) ) + if ( !(irq_desc[vector].status & IRQ_GUEST) ) continue; - action =3D (irq_guest_action_t *)irq_desc[irq].action; + action =3D (irq_guest_action_t *)irq_desc[vector].action; cpu_clear(smp_processor_id(), action->cpu_eoi_map); } =20 Index: 2008-11-20/xen/arch/x86/msi.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 2008-11-20.orig/xen/arch/x86/msi.c 2008-11-20 10:55:17.000000000 = +0100 +++ 2008-11-20/xen/arch/x86/msi.c 2008-11-20 08:47:05.000000000 = +0100 @@ -212,9 +212,9 @@ static void write_msi_msg(struct msi_des entry->msg =3D *msg; } =20 -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 =3D irq_desc[irq].msi_desc; + struct msi_desc *desc =3D irq_desc[vector].msi_desc; struct msi_msg msg; unsigned int dest; =20 @@ -227,7 +227,7 @@ void set_msi_irq_affinity(unsigned int i if ( !desc ) return; =20 - 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); =20 @@ -276,9 +276,9 @@ static void msix_set_enable(struct pci_d } } =20 -static void msix_flush_writes(unsigned int irq) +static void msix_flush_writes(unsigned int vector) { - struct msi_desc *entry =3D irq_desc[irq].msi_desc; + struct msi_desc *entry =3D irq_desc[vector].msi_desc; =20 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; } =20 -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 =3D irq_desc[irq].msi_desc; + struct msi_desc *entry =3D irq_desc[vector].msi_desc; =20 - 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 =3D !!flag; } =20 -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); } =20 -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); } =20 static struct msi_desc* alloc_msi_entry(void) Index: 2008-11-20/xen/include/asm-ia64/hvm/irq.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 2008-11-20.orig/xen/include/asm-ia64/hvm/irq.h 2008-11-20 = 10:55:17.000000000 +0100 +++ 2008-11-20/xen/include/asm-ia64/hvm/irq.h 2008-11-20 10:55:41.0000000= 00 +0100 @@ -24,7 +24,6 @@ =20 #include =20 -#define NR_VECTORS 256 #define VIOAPIC_NUM_PINS 48 =20 #include Index: 2008-11-20/xen/include/asm-ia64/linux/asm/irq.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 2008-11-20.orig/xen/include/asm-ia64/linux/asm/irq.h 2008-11-19 = 15:42:23.000000000 +0100 +++ 2008-11-20/xen/include/asm-ia64/linux/asm/irq.h 2008-11-20 = 10:55:58.000000000 +0100 @@ -11,6 +11,7 @@ * 02/29/00 D.Mosberger moved most things into hw_irq.h */ =20 +#define NR_VECTORS 256 #define NR_IRQS 256 #define NR_IRQ_VECTORS NR_IRQS =20 Index: 2008-11-20/xen/include/asm-x86/msi.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 2008-11-20.orig/xen/include/asm-x86/msi.h 2008-11-20 10:55:17.0000000= 00 +0100 +++ 2008-11-20/xen/include/asm-x86/msi.h 2008-11-20 08:47:05.0000000= 00 +0100 @@ -69,9 +69,9 @@ struct msi_msg { }; =20 /* 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); Index: 2008-11-20/xen/include/xen/irq.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 2008-11-20.orig/xen/include/xen/irq.h 2008-11-20 10:55:17.0000000= 00 +0100 +++ 2008-11-20/xen/include/xen/irq.h 2008-11-20 08:47:05.000000000 = +0100 @@ -61,7 +61,7 @@ typedef struct { cpumask_t affinity; } __cacheline_aligned irq_desc_t; =20 -extern irq_desc_t irq_desc[NR_IRQS]; +extern irq_desc_t irq_desc[NR_VECTORS]; =20 extern int setup_irq(unsigned int, struct irqaction *); extern void free_irq(unsigned int); @@ -81,13 +81,16 @@ extern void pirq_guest_unbind(struct dom extern irq_desc_t *domain_spin_lock_irq_desc( struct domain *d, int irq, unsigned long *pflags); =20 -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 =3D mask; + irq_desc[vector].affinity =3D mask; } =20 +#ifdef irq_to_vector static 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__ */