WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] linux-2.6.18/MSI-X: Avoid unconditional BUG() in Dom

To: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] linux-2.6.18/MSI-X: Avoid unconditional BUG() in DomU
From: "Jan Beulich" <JBeulich@xxxxxxxx>
Date: Fri, 07 Oct 2011 16:36:08 +0100
Delivery-date: Fri, 07 Oct 2011 08:35:43 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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>

--- a/drivers/pci/msi-xen.c
+++ b/drivers/pci/msi-xen.c
@@ -547,9 +547,8 @@ int pci_enable_msi(struct pci_dev* dev
        if (status < 0)
                return status;
 
+       if (!is_initial_xendomain()) {
 #ifdef CONFIG_XEN_PCIDEV_FRONTEND
-       if (!is_initial_xendomain())
-       {
                int ret;
 
                temp = dev->irq;
@@ -563,8 +562,10 @@ int pci_enable_msi(struct pci_dev* dev
                msi_dev_entry->default_irq = temp;
 
                return ret;
-       }
+#else
+               return -EOPNOTSUPP;
 #endif
+       }
 
        temp = dev->irq;
 
@@ -592,8 +593,8 @@ void pci_disable_msi(struct pci_dev* dev
        if (!dev)
                return;
 
-#ifdef CONFIG_XEN_PCIDEV_FRONTEND
        if (!is_initial_xendomain()) {
+#ifdef CONFIG_XEN_PCIDEV_FRONTEND
                if (!(dev->msi_enabled)) {
                        printk(KERN_INFO "PCI: %s: Device did not enabled 
MSI.\n",
                               pci_name(dev));
@@ -603,9 +604,9 @@ void pci_disable_msi(struct pci_dev* dev
                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)
@@ -663,8 +664,8 @@ void pci_disable_msix(struct pci_dev *de
                if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
                        return -EINVAL;
 
-#ifdef CONFIG_XEN_PCIDEV_FRONTEND
        if (!is_initial_xendomain()) {
+#ifdef CONFIG_XEN_PCIDEV_FRONTEND
                struct msi_pirq_entry *pirq_entry;
                int ret, irq;
 
@@ -696,9 +697,11 @@ int pci_enable_msix(struct pci_dev* dev,
                        attach_pirq_entry(irq, entries[i].entry, msi_dev_entry);
                        entries[i].vector = irq;
                }
-        return 0;
-       }
+               return 0;
+#else
+               return -EOPNOTSUPP;
 #endif
+       }
 
        status = msi_init();
        if (status < 0)
@@ -741,8 +744,8 @@ void pci_disable_msix(struct pci_dev *de
                return;
        }
 
-#ifdef CONFIG_XEN_PCIDEV_FRONTEND
        if (!is_initial_xendomain()) {
+#ifdef CONFIG_XEN_PCIDEV_FRONTEND
                struct msi_dev_list *msi_dev_entry;
                struct msi_pirq_entry *pirq_entry, *tmp;

@@ -758,9 +761,9 @@ void pci_msix_shutdown(struct pci_dev *d

                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)
@@ -800,7 +791,10 @@ void msi_remove_pci_irq_vectors(struct p
        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-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] linux-2.6.18/MSI-X: Avoid unconditional BUG() in DomU, Jan Beulich <=