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] xen/pciback: use mutex rather than spinlock in passt

To: "Konrad Rzeszutek Wilk" <konrad.wilk@xxxxxxxxxx>
Subject: [Xen-devel] [PATCH] xen/pciback: use mutex rather than spinlock in passthrough backend
From: "Jan Beulich" <JBeulich@xxxxxxxx>
Date: Mon, 19 Sep 2011 17:32:15 +0100
Cc: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
Delivery-date: Mon, 19 Sep 2011 09:32:26 -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
To accommodate the call to the callback function from
__xen_pcibk_publish_pci_roots(), which so far dropped and the re-
acquired the lock without checking that the list didn't actually
change, convert the code to use a mutex instead (observing that the
code taking the lock won't ever get called from non-sleepable
context).

As a result, drop the bogus use of list_for_each_entry_safe() and
remove the inappropriate dropping of the lock.

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

---
 drivers/xen/xen-pciback/passthrough.c |   32 +++++++++++++-------------------
 1 file changed, 13 insertions(+), 19 deletions(-)

--- 3.1-rc6/drivers/xen/xen-pciback/passthrough.c
+++ 3.1-rc6-xen-pciback-passthr-mutex/drivers/xen/xen-pciback/passthrough.c
@@ -7,13 +7,13 @@
 
 #include <linux/list.h>
 #include <linux/pci.h>
-#include <linux/spinlock.h>
+#include <linux/mutex.h>
 #include "pciback.h"
 
 struct passthrough_dev_data {
        /* Access to dev_list must be protected by lock */
        struct list_head dev_list;
-       spinlock_t lock;
+       struct mutex lock;
 };
 
 static struct pci_dev *__xen_pcibk_get_pci_dev(struct xen_pcibk_device *pdev,
@@ -24,9 +24,8 @@ static struct pci_dev *__xen_pcibk_get_p
        struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
        struct pci_dev_entry *dev_entry;
        struct pci_dev *dev = NULL;
-       unsigned long flags;
 
-       spin_lock_irqsave(&dev_data->lock, flags);
+       mutex_lock(&dev_data->lock);
 
        list_for_each_entry(dev_entry, &dev_data->dev_list, list) {
                if (domain == (unsigned int)pci_domain_nr(dev_entry->dev->bus)
@@ -37,7 +36,7 @@ static struct pci_dev *__xen_pcibk_get_p
                }
        }
 
-       spin_unlock_irqrestore(&dev_data->lock, flags);
+       mutex_unlock(&dev_data->lock);
 
        return dev;
 }
@@ -48,7 +47,6 @@ static int __xen_pcibk_add_pci_dev(struc
 {
        struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
        struct pci_dev_entry *dev_entry;
-       unsigned long flags;
        unsigned int domain, bus, devfn;
        int err;
 
@@ -57,9 +55,9 @@ static int __xen_pcibk_add_pci_dev(struc
                return -ENOMEM;
        dev_entry->dev = dev;
 
-       spin_lock_irqsave(&dev_data->lock, flags);
+       mutex_lock(&dev_data->lock);
        list_add_tail(&dev_entry->list, &dev_data->dev_list);
-       spin_unlock_irqrestore(&dev_data->lock, flags);
+       mutex_unlock(&dev_data->lock);
 
        /* Publish this device. */
        domain = (unsigned int)pci_domain_nr(dev->bus);
@@ -76,9 +74,8 @@ static void __xen_pcibk_release_pci_dev(
        struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
        struct pci_dev_entry *dev_entry, *t;
        struct pci_dev *found_dev = NULL;
-       unsigned long flags;
 
-       spin_lock_irqsave(&dev_data->lock, flags);
+       mutex_lock(&dev_data->lock);
 
        list_for_each_entry_safe(dev_entry, t, &dev_data->dev_list, list) {
                if (dev_entry->dev == dev) {
@@ -88,7 +85,7 @@ static void __xen_pcibk_release_pci_dev(
                }
        }
 
-       spin_unlock_irqrestore(&dev_data->lock, flags);
+       mutex_unlock(&dev_data->lock);
 
        if (found_dev)
                pcistub_put_pci_dev(found_dev);
@@ -102,7 +99,7 @@ static int __xen_pcibk_init_devices(stru
        if (!dev_data)
                return -ENOMEM;
 
-       spin_lock_init(&dev_data->lock);
+       mutex_init(&dev_data->lock);
 
        INIT_LIST_HEAD(&dev_data->dev_list);
 
@@ -116,14 +113,14 @@ static int __xen_pcibk_publish_pci_roots
 {
        int err = 0;
        struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
-       struct pci_dev_entry *dev_entry, *e, *tmp;
+       struct pci_dev_entry *dev_entry, *e;
        struct pci_dev *dev;
        int found;
        unsigned int domain, bus;
 
-       spin_lock(&dev_data->lock);
+       mutex_lock(&dev_data->lock);
 
-       list_for_each_entry_safe(dev_entry, tmp, &dev_data->dev_list, list) {
+       list_for_each_entry(dev_entry, &dev_data->dev_list, list) {
                /* Only publish this device as a root if none of its
                 * parent bridges are exported
                 */
@@ -142,16 +139,13 @@ static int __xen_pcibk_publish_pci_roots
                bus = (unsigned int)dev_entry->dev->bus->number;
 
                if (!found) {
-                       spin_unlock(&dev_data->lock);
                        err = publish_root_cb(pdev, domain, bus);
                        if (err)
                                break;
-                       spin_lock(&dev_data->lock);
                }
        }
 
-       if (!err)
-               spin_unlock(&dev_data->lock);
+       mutex_unlock(&dev_data->lock);
 
        return err;
 }



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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] xen/pciback: use mutex rather than spinlock in passthrough backend, Jan Beulich <=