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 2/6] Provide a mechanism to register domain owner of

To: xen-devel@xxxxxxxxxxxxxxxxxxx, Jeremy Fitzhardinge <jeremy@xxxxxxxx>
Subject: [Xen-devel] [PATCH 2/6] Provide a mechanism to register domain owner of a PCI device.
From: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
Date: Wed, 9 Dec 2009 15:51:37 -0500
Cc: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
Delivery-date: Wed, 09 Dec 2009 13:02:05 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <1260391901-16685-2-git-send-email-konrad.wilk@xxxxxxxxxx>
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>
References: <1260391901-16685-1-git-send-email-konrad.wilk@xxxxxxxxxx> <1260391901-16685-2-git-send-email-konrad.wilk@xxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
. and also to find the domain owner based on the PCI device and
to unregister a domain owner of a PCI device.

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

diff --git a/arch/x86/include/asm/xen/pci.h b/arch/x86/include/asm/xen/pci.h
index cb84abe..f4312d5 100644
--- a/arch/x86/include/asm/xen/pci.h
+++ b/arch/x86/include/asm/xen/pci.h
@@ -7,6 +7,11 @@ int xen_create_msi_irq(struct pci_dev *dev,
                        struct msi_desc *msidesc,
                        int type);
 int xen_destroy_irq(int irq);
+
+int find_device_owner(struct pci_dev *dev);
+int register_device_owner(struct pci_dev *dev, domid_t domain);
+int unregister_device_owner(struct pci_dev *dev);
+
 #else
 static inline int xen_register_gsi(u32 gsi, int triggering, int polarity)
 {
@@ -23,6 +28,17 @@ static inline int xen_destroy_irq(int irq)
 {
        return -1;
 }
+
+static inline int find_device_owner(struct pci_dev *dev) { return -1; }
+static inline int register_device_owner(struct pci_dev *dev, domid_t domain)
+{
+       return -1;
+}
+static inline int unregister_device_owner(struct pci_dev *dev)
+{
+       return -1;
+}
+
 #endif
 
 #if defined(CONFIG_PCI_MSI) && defined(CONFIG_XEN_DOM0_PCI)
diff --git a/arch/x86/xen/pci.c b/arch/x86/xen/pci.c
index 44d91ad..4fa734c 100644
--- a/arch/x86/xen/pci.c
+++ b/arch/x86/xen/pci.c
@@ -2,6 +2,7 @@
 #include <linux/acpi.h>
 #include <linux/pci.h>
 #include <linux/msi.h>
+#include <linux/slab.h>
 
 #include <asm/mpspec.h>
 #include <asm/io_apic.h>
@@ -109,3 +110,75 @@ error:
        return ret;
 }
 #endif
+
+struct device_owner {
+       domid_t domain;
+       struct pci_dev *dev;
+       struct list_head list;
+};
+
+static DEFINE_SPINLOCK(dev_domain_list_spinlock);
+static struct list_head dev_domain_list = LIST_HEAD_INIT(dev_domain_list);
+
+struct device_owner *find_device(struct pci_dev *dev)
+{
+
+       struct device_owner *owner;
+
+       list_for_each_entry(owner, &dev_domain_list, list) {
+               if (owner->dev == dev)
+                       return owner;
+       }
+       return NULL;
+}
+
+int find_device_owner(struct pci_dev *dev)
+{
+
+       struct device_owner *owner = NULL;
+
+       owner = find_device(dev);
+       if (!owner)
+               return -ENODEV;
+
+       return owner->domain;
+}
+EXPORT_SYMBOL(find_device_owner);
+
+int register_device_owner(struct pci_dev *dev, domid_t domain)
+{
+       struct device_owner *owner;
+       unsigned long flags;
+
+       if (find_device(dev))
+               return -EEXIST;
+
+       owner = kzalloc(sizeof(struct device_owner), GFP_KERNEL);
+       owner->domain = domain;
+       owner->dev = dev;
+
+       spin_lock_irqsave(&dev_domain_list_spinlock, flags);
+       list_add_tail(&owner->list, &dev_domain_list);
+       spin_unlock_irqrestore(&dev_domain_list_spinlock, flags);
+
+       return 0;
+}
+EXPORT_SYMBOL(register_device_owner);
+
+int unregister_device_owner(struct pci_dev *dev)
+{
+       struct device_owner *owner = NULL;
+       unsigned long flags;
+
+       owner = find_device(dev);
+       if (!owner)
+               return -ENODEV;
+
+       spin_lock_irqsave(&dev_domain_list_spinlock, flags);
+       list_del(&owner->list);
+       spin_unlock_irqrestore(&dev_domain_list_spinlock, flags);
+
+       kfree(owner);
+       return 0;
+}
+EXPORT_SYMBOL(unregister_device_owner);
-- 
1.6.2.5


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