From cc27d51d7566b0a70334f17fa893e05ef7e730fc Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 4 Feb 2009 12:26:00 +0000 Subject: [PATCH] linux: fix IRQ handling for PV passthrough For DomU-s registering PIRQ-s must be done separately, as they don't use the IO-APIC code. Additionally make sure the IRQ chip doesn't get set twice (and the event channel information overwritten) for an IRQ possibly in use by more than one device. Signed-off-by: Jan Beulich --- arch/i386/pci/pcifront.c | 2 ++ drivers/xen/core/evtchn.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/arch/i386/pci/pcifront.c b/arch/i386/pci/pcifront.c index 7009115d..34f3bcb9 100644 --- a/arch/i386/pci/pcifront.c +++ b/arch/i386/pci/pcifront.c @@ -8,12 +8,14 @@ #include #include #include +#include #include "pci.h" static int pcifront_enable_irq(struct pci_dev *dev) { u8 irq; pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq); + evtchn_register_pirq(irq); dev->irq = irq; return 0; diff --git a/drivers/xen/core/evtchn.c b/drivers/xen/core/evtchn.c index e5c633df..e358a3d1 100644 --- a/drivers/xen/core/evtchn.c +++ b/drivers/xen/core/evtchn.c @@ -1078,7 +1078,7 @@ void irq_resume(void) void evtchn_register_pirq(int irq) { BUG_ON(irq < PIRQ_BASE || irq - PIRQ_BASE > NR_PIRQS); - if (identity_mapped_irq(irq)) + if (identity_mapped_irq(irq) || type_from_irq(irq) != IRQT_UNBOUND) return; irq_info[irq] = mk_irq_info(IRQT_PIRQ, irq, 0); irq_desc[irq].chip = &pirq_type; -- 2.39.5