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] Re: [PATCH 2/6] Provide a mechanism to register domain owner

To: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
Subject: [Xen-devel] Re: [PATCH 2/6] Provide a mechanism to register domain owner of a PCI device.
From: Jeremy Fitzhardinge <jeremy@xxxxxxxx>
Date: Wed, 09 Dec 2009 13:11:30 -0800
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
Delivery-date: Wed, 09 Dec 2009 13:13:49 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <1260391901-16685-3-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> <1260391901-16685-3-git-send-email-konrad.wilk@xxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.5) Gecko/20091125 Fedora/3.0-3.12.rc1.fc12 Lightning/1.0pre Thunderbird/3.0
On 12/09/09 12:51, Konrad Rzeszutek Wilk wrote:
. 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);

Could you give these less generic names?

+
  #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;
+}

Make the formatting consistent here.

+
  #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 {

Again, a bit generic (the name should at least convey we're talking about owner domains).


+       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;
Stray blank line.
+
+       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;
Again.
+
+       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))
Should this be under the lock?
+               return -EEXIST;
+
+       owner = kzalloc(sizeof(struct device_owner), GFP_KERNEL);
Check for NULL.
+       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);
Shouldn't this be under the lock too?
+       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);

Thanks,
    J

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

<Prev in Thread] Current Thread [Next in Thread>