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

[Xen-changelog] [linux-2.6.18-xen] MSI-X: Avoid unconditional BUG() in DomU



# HG changeset patch
# User Jan Beulich <jbeulich@xxxxxxxx>
# Date 1318250600 -7200
# Node ID 28740a325058c0c196ef22f59506710dc4ff4c55
# Parent  40e33b2fce948cbdcc0ec27404b58b1acc9b7fc8
MSI-X: Avoid unconditional BUG() in DomU

msi_remove_pci_irq_vectors() unconditionally (i.e. even in a DomU)
calling msi_unmap_pirq() is guaranteed to BUG() in msi_get_dev_owner().
Adjust the function to call evtchn_map_pirq() instead in a DomU (just
like pci_disable_msix() is doing).

While looking into this I also realized that the
CONFIG_XEN_PCIDEV_FRONTEND conditionals are misplaced - since on x86-64
it is possible to build with this disabled, execution would flow into
Dom0 code even on a DomU in this case. Hence adjust their placement at
once.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---


diff -r 40e33b2fce94 -r 28740a325058 drivers/pci/msi-xen.c
--- a/drivers/pci/msi-xen.c     Thu Oct 06 11:24:48 2011 +0200
+++ b/drivers/pci/msi-xen.c     Mon Oct 10 14:43:20 2011 +0200
@@ -625,9 +625,8 @@
        if (status < 0)
                return status;
 
+       if (!is_initial_xendomain()) {
 #ifdef CONFIG_XEN_PCIDEV_FRONTEND
-       if (!is_initial_xendomain())
-       {
                int ret;
 
                temp = dev->irq;
@@ -640,8 +639,10 @@
                msi_dev_entry->default_irq = temp;
 
                return ret;
+#else
+               return -EOPNOTSUPP;
+#endif
        }
-#endif
 
        temp = dev->irq;
 
@@ -679,8 +680,8 @@
        if (!dev)
                return;
 
+       if (!is_initial_xendomain()) {
 #ifdef CONFIG_XEN_PCIDEV_FRONTEND
-       if (!is_initial_xendomain()) {
                if (!(dev->msi_enabled)) {
                        printk(KERN_INFO "PCI: %s: Device did not enabled 
MSI.\n",
                               pci_name(dev));
@@ -690,9 +691,9 @@
                pci_frontend_disable_msi(dev);
                dev->irq = msi_dev_entry->default_irq;
                dev->msi_enabled = 0;
+#endif
                return;
        }
-#endif
 
        pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
        if (!pos)
@@ -748,8 +749,8 @@
                if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
                        return -EINVAL;
 
+       if (!is_initial_xendomain()) {
 #ifdef CONFIG_XEN_PCIDEV_FRONTEND
-       if (!is_initial_xendomain()) {
                struct msi_pirq_entry *pirq_entry;
                int ret, irq;
 
@@ -780,9 +781,11 @@
                        attach_pirq_entry(irq, entries[i].entry, msi_dev_entry);
                        entries[i].vector = irq;
                }
-        return 0;
+               return 0;
+#else
+               return -EOPNOTSUPP;
+#endif
        }
-#endif
 
        status = msi_init();
        if (status < 0)
@@ -843,8 +846,8 @@
                return;
        }
 
+       if (!is_initial_xendomain()) {
 #ifdef CONFIG_XEN_PCIDEV_FRONTEND
-       if (!is_initial_xendomain()) {
                struct msi_dev_list *msi_dev_entry;
                struct msi_pirq_entry *pirq_entry, *tmp;
 
@@ -860,9 +863,9 @@
 
                dev->irq = msi_dev_entry->default_irq;
                dev->msix_enabled = 0;
+#endif
                return;
        }
-#endif
 
        pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
        if (!pos)
@@ -902,7 +905,10 @@
        if (!list_empty(&msi_dev_entry->pirq_list_head))
                list_for_each_entry_safe(pirq_entry, tmp,
                                         &msi_dev_entry->pirq_list_head, list) {
-                       msi_unmap_pirq(dev, pirq_entry->pirq);
+                       if (is_initial_xendomain())
+                               msi_unmap_pirq(dev, pirq_entry->pirq);
+                       else
+                               evtchn_map_pirq(pirq_entry->pirq, 0);
                        list_del(&pirq_entry->list);
                        kfree(pirq_entry);
                }

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


 


Rackspace

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