[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 8/9] Provide a 'xen_teardown_msi_dev' function to be called by 'arch_teardown_msi_irqs'.



The 'xen_teardown_msi_dev' will call pci_frontend_disable_[msi|msix] when
running in non-privileged PV mode. In all other cases it is effectively a NOP.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
---
 arch/x86/include/asm/xen/pci.h |    2 ++
 arch/x86/kernel/apic/io_apic.c |    5 +++++
 arch/x86/xen/pci.c             |   16 ++++++++++++++++
 3 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/arch/x86/include/asm/xen/pci.h b/arch/x86/include/asm/xen/pci.h
index 8adb33a..6c022c8 100644
--- a/arch/x86/include/asm/xen/pci.h
+++ b/arch/x86/include/asm/xen/pci.h
@@ -7,6 +7,7 @@ int xen_create_msi_irq(struct pci_dev *dev,
                        struct msi_desc *msidesc,
                        int type, int pirq_override);
 int xen_destroy_irq(int irq);
+void xen_teardown_msi_dev(struct pci_dev *dev);
 #else
 static inline int xen_register_gsi(u32 gsi, int triggering, int polarity)
 {
@@ -23,6 +24,7 @@ static inline int xen_destroy_irq(int irq)
 {
        return -1;
 }
+static inline void xen_teardown_msi_dev(struct pci_dev *dev) { }
 #endif
 
 #if defined(CONFIG_PCI_MSI) && defined(CONFIG_XEN_DOM0_PCI)
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 0cc2dde..b9a0e67 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -3576,6 +3576,11 @@ void arch_teardown_msi_irqs(struct pci_dev *dev)
 {
        struct msi_desc *entry;
 
+       /* If we are non-privileged PV domain, we have to
+       * to call xen_teardown_msi_dev first. */
+       if (xen_domain())
+               xen_teardown_msi_dev(dev);
+
        list_for_each_entry(entry, &dev->msi_list, list) {
                int i, nvec;
                if (entry->irq == 0)
diff --git a/arch/x86/xen/pci.c b/arch/x86/xen/pci.c
index dc02241..b572f26 100644
--- a/arch/x86/xen/pci.c
+++ b/arch/x86/xen/pci.c
@@ -125,4 +125,20 @@ error:
        kfree(v);
        return ret;
 }
+
+void xen_teardown_msi_dev(struct pci_dev *dev)
+{
+       /* Only do this when were are in non-privileged mode.*/
+       if (!xen_initial_domain()) {
+               struct msi_desc *msidesc;
+
+               msidesc = list_entry(dev->msi_list.next, struct msi_desc, list);
+               if (msidesc->msi_attrib.is_msix)
+                       pci_frontend_disable_msix(dev);
+               else
+                       pci_frontend_disable_msi(dev);
+       }
+
+}
+
 #endif
-- 
1.6.2.5


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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.