[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [linux-2.6.18-xen] Revert 654:8925ce7552528 (linux/pci-msi: translate Xen-provided PIRQs)
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1220614769 -3600 # Node ID ad374a7a9f3ed6417ffa9ba9590e056d67081985 # Parent 2dc7ebf488b9df77ac1a1923e72c61c6685ebadb Revert 654:8925ce7552528 (linux/pci-msi: translate Xen-provided PIRQs) Breaks the -xenU configuration ("MAX_IO_APICS undefined") Also implicated in kernel crash during save/restore in our automated tests. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- arch/i386/kernel/io_apic-xen.c | 3 - arch/x86_64/kernel/io_apic-xen.c | 3 - drivers/pci/msi-xen.c | 16 +----- drivers/xen/core/evtchn.c | 84 +++----------------------------- include/asm-i386/mach-xen/irq_vectors.h | 6 -- include/xen/evtchn.h | 7 -- 6 files changed, 15 insertions(+), 104 deletions(-) diff -r 2dc7ebf488b9 -r ad374a7a9f3e arch/i386/kernel/io_apic-xen.c --- a/arch/i386/kernel/io_apic-xen.c Fri Sep 05 11:12:55 2008 +0100 +++ b/arch/i386/kernel/io_apic-xen.c Fri Sep 05 12:39:29 2008 +0100 @@ -47,7 +47,6 @@ #include <xen/interface/xen.h> #include <xen/interface/physdev.h> -#include <xen/evtchn.h> /* Fake i8259 */ #define make_8259A_irq(_irq) (io_apic_irqs &= ~(1UL<<(_irq))) @@ -1261,7 +1260,7 @@ static void ioapic_register_intr(int irq set_intr_gate(vector, interrupt[idx]); } #else -#define ioapic_register_intr(irq, vector, trigger) evtchn_register_pirq(irq) +#define ioapic_register_intr(_irq,_vector,_trigger) ((void)0) #endif static void __init setup_IO_APIC_irqs(void) diff -r 2dc7ebf488b9 -r ad374a7a9f3e arch/x86_64/kernel/io_apic-xen.c --- a/arch/x86_64/kernel/io_apic-xen.c Fri Sep 05 11:12:55 2008 +0100 +++ b/arch/x86_64/kernel/io_apic-xen.c Fri Sep 05 12:39:29 2008 +0100 @@ -95,7 +95,6 @@ int vector_irq[NR_VECTORS] __read_mostly #include <xen/interface/xen.h> #include <xen/interface/physdev.h> -#include <xen/evtchn.h> /* Fake i8259 */ #define make_8259A_irq(_irq) (io_apic_irqs &= ~(1UL<<(_irq))) @@ -941,7 +940,7 @@ static void ioapic_register_intr(int irq set_intr_gate(vector, interrupt[idx]); } #else -#define ioapic_register_intr(irq, vector, trigger) evtchn_register_pirq(irq) +#define ioapic_register_intr(_irq,_vector,_trigger) ((void)0) #endif /* !CONFIG_XEN */ static void __init setup_IO_APIC_irqs(void) diff -r 2dc7ebf488b9 -r ad374a7a9f3e drivers/pci/msi-xen.c --- a/drivers/pci/msi-xen.c Fri Sep 05 11:12:55 2008 +0100 +++ b/drivers/pci/msi-xen.c Fri Sep 05 12:39:29 2008 +0100 @@ -15,8 +15,6 @@ #include <linux/pci.h> #include <linux/proc_fs.h> -#include <xen/evtchn.h> - #include <asm/errno.h> #include <asm/io.h> #include <asm/smp.h> @@ -158,15 +156,13 @@ static int msi_unmap_pirq(struct pci_dev int rc; unmap.domid = msi_get_dev_owner(dev); - unmap.pirq = evtchn_get_xen_pirq(pirq); + unmap.pirq = pirq; if ((rc = HYPERVISOR_physdev_op(PHYSDEVOP_unmap_pirq, &unmap))) printk(KERN_WARNING "unmap irq %x failed\n", pirq); if (rc < 0) return rc; - - evtchn_map_pirq(pirq, 0); return 0; } @@ -201,7 +197,7 @@ static int msi_map_pirq_to_vector(struct map_irq.domid = domid; map_irq.type = MAP_PIRQ_TYPE_MSI; map_irq.index = -1; - map_irq.pirq = pirq < 0 ? -1 : evtchn_get_xen_pirq(pirq); + map_irq.pirq = pirq; map_irq.bus = dev->bus->number; map_irq.devfn = dev->devfn; map_irq.entry_nr = entry_nr; @@ -212,12 +208,8 @@ static int msi_map_pirq_to_vector(struct if (rc < 0) return rc; - /* This happens when MSI support is not enabled in Xen. */ - if (rc == 0 && map_irq.pirq < 0) - return -ENOSYS; - - BUG_ON(map_irq.pirq <= 0); - return evtchn_map_pirq(pirq, map_irq.pirq); + + return map_irq.pirq; } static int msi_map_vector(struct pci_dev *dev, int entry_nr, u64 table_base) diff -r 2dc7ebf488b9 -r ad374a7a9f3e drivers/xen/core/evtchn.c --- a/drivers/xen/core/evtchn.c Fri Sep 05 11:12:55 2008 +0100 +++ b/drivers/xen/core/evtchn.c Fri Sep 05 12:39:29 2008 +0100 @@ -66,27 +66,13 @@ enum { IRQT_VIRQ, IRQT_IPI, IRQT_LOCAL_PORT, - IRQT_CALLER_PORT, - _IRQT_COUNT + IRQT_CALLER_PORT }; - -#define _IRQT_BITS 4 -#define _EVTCHN_BITS 12 -#define _INDEX_BITS (32 - _IRQT_BITS - _EVTCHN_BITS) /* Constructor for packed IRQ information. */ static inline u32 mk_irq_info(u32 type, u32 index, u32 evtchn) { - BUILD_BUG_ON(_IRQT_COUNT > (1U << _IRQT_BITS)); - - BUILD_BUG_ON(NR_PIRQS > (1U << _INDEX_BITS)); - BUILD_BUG_ON(NR_VIRQS > (1U << _INDEX_BITS)); - BUILD_BUG_ON(NR_IPIS > (1U << _INDEX_BITS)); - BUG_ON(index >> _INDEX_BITS); - - BUILD_BUG_ON(NR_EVENT_CHANNELS > (1U << _EVTCHN_BITS)); - - return ((type << (32 - _IRQT_BITS)) | (index << _EVTCHN_BITS) | evtchn); + return ((type << 24) | (index << 16) | evtchn); } /* Convenient shorthand for packed representation of an unbound IRQ. */ @@ -98,17 +84,17 @@ static inline u32 mk_irq_info(u32 type, static inline unsigned int evtchn_from_irq(int irq) { - return irq_info[irq] & ((1U << _EVTCHN_BITS) - 1); + return (u16)(irq_info[irq]); } static inline unsigned int index_from_irq(int irq) { - return (irq_info[irq] >> _EVTCHN_BITS) & ((1U << _INDEX_BITS) - 1); + return (u8)(irq_info[irq] >> 16); } static inline unsigned int type_from_irq(int irq) { - return irq_info[irq] >> (32 - _IRQT_BITS); + return (u8)(irq_info[irq] >> 24); } /* IRQ <-> VIRQ mapping. */ @@ -756,60 +742,6 @@ static struct hw_interrupt_type dynirq_t .retrigger = resend_irq_on_evtchn, }; -void evtchn_register_pirq(int irq) -{ - irq_info[irq] = mk_irq_info(IRQT_PIRQ, irq, 0); -} - -#ifndef CONFIG_X86_IO_APIC -#undef IO_APIC_IRQ -#define IO_APIC_IRQ(irq) ((irq) >= pirq_to_irq(16)) -#endif - -int evtchn_map_pirq(int irq, int xen_pirq) -{ - if (irq < 0) { - static DEFINE_SPINLOCK(irq_alloc_lock); - - irq = pirq_to_irq(NR_PIRQS - 1); - spin_lock(&irq_alloc_lock); - do { - if (!IO_APIC_IRQ(irq)) - continue; - if (!index_from_irq(irq)) { - BUG_ON(type_from_irq(irq) != IRQT_UNBOUND); - irq_info[irq] = mk_irq_info(IRQT_PIRQ, - xen_pirq, 0); - break; - } - } while (--irq); - spin_unlock(&irq_alloc_lock); - if (irq < pirq_to_irq(16)) - return -ENOSPC; - } else if (!xen_pirq) { - if (unlikely(type_from_irq(irq) != IRQT_PIRQ)) - return -EINVAL; - irq_info[irq] = IRQ_UNBOUND; - return 0; - } else if (type_from_irq(irq) != IRQT_PIRQ - || index_from_irq(irq) != xen_pirq) { - printk(KERN_ERR "IRQ#%d is already mapped to %d:%u - " - "cannot map to PIRQ#%u\n", - irq, type_from_irq(irq), index_from_irq(irq), xen_pirq); - return -EINVAL; - } - return index_from_irq(irq) ? irq : -EINVAL; -} - -int evtchn_get_xen_pirq(int irq) -{ - if (!IO_APIC_IRQ(irq)) - return irq; - if (unlikely(type_from_irq(irq) != IRQT_PIRQ)) - return 0; - return index_from_irq(irq); -} - static inline void pirq_unmask_notify(int pirq) { struct physdev_eoi eoi = { .irq = pirq }; @@ -842,7 +774,7 @@ static unsigned int startup_pirq(unsigne if (VALID_EVTCHN(evtchn)) goto out; - bind_pirq.pirq = evtchn_get_xen_pirq(irq); + bind_pirq.pirq = irq; /* NB. We are happy to share unless we are probing. */ bind_pirq.flags = probing_irq(irq) ? 0 : BIND_PIRQ__WILL_SHARE; if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_pirq, &bind_pirq) != 0) { @@ -857,7 +789,7 @@ static unsigned int startup_pirq(unsigne evtchn_to_irq[evtchn] = irq; bind_evtchn_to_cpu(evtchn, 0); - irq_info[irq] = mk_irq_info(IRQT_PIRQ, bind_pirq.pirq, evtchn); + irq_info[irq] = mk_irq_info(IRQT_PIRQ, irq, evtchn); out: unmask_evtchn(evtchn); @@ -882,7 +814,7 @@ static void shutdown_pirq(unsigned int i bind_evtchn_to_cpu(evtchn, 0); evtchn_to_irq[evtchn] = -1; - irq_info[irq] = mk_irq_info(IRQT_PIRQ, index_from_irq(irq), 0); + irq_info[irq] = IRQ_UNBOUND; } static void enable_pirq(unsigned int irq) diff -r 2dc7ebf488b9 -r ad374a7a9f3e include/asm-i386/mach-xen/irq_vectors.h --- a/include/asm-i386/mach-xen/irq_vectors.h Fri Sep 05 11:12:55 2008 +0100 +++ b/include/asm-i386/mach-xen/irq_vectors.h Fri Sep 05 12:39:29 2008 +0100 @@ -108,11 +108,7 @@ */ #define PIRQ_BASE 0 -#if NR_CPUS < MAX_IO_APICS -# define NR_PIRQS (NR_VECTORS + 32 * NR_CPUS) -#else -# define NR_PIRQS (NR_VECTORS + 32 * MAX_IO_APICS) -#endif +#define NR_PIRQS 256 #define DYNIRQ_BASE (PIRQ_BASE + NR_PIRQS) #define NR_DYNIRQS 256 diff -r 2dc7ebf488b9 -r ad374a7a9f3e include/xen/evtchn.h --- a/include/xen/evtchn.h Fri Sep 05 11:12:55 2008 +0100 +++ b/include/xen/evtchn.h Fri Sep 05 12:39:29 2008 +0100 @@ -101,13 +101,6 @@ asmlinkage void evtchn_do_upcall(struct /* Entry point for notifications into the userland character device. */ void evtchn_device_upcall(int port); -/* Mark a PIRQ as unavailable for dynamic allocation. */ -void evtchn_register_pirq(int irq); -/* Map a Xen-supplied PIRQ to a dynamically allocated one. */ -int evtchn_map_pirq(int irq, int xen_pirq); -/* Look up a Xen-supplied PIRQ for a dynamically allocated one. */ -int evtchn_get_xen_pirq(int irq); - void mask_evtchn(int port); void disable_all_local_evtchn(void); void unmask_evtchn(int port); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |