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-changelog

[Xen-changelog] Change the xenbus_map_ring_valloc() interface and implem

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Change the xenbus_map_ring_valloc() interface and implementation so
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 25 Apr 2006 22:42:08 +0000
Delivery-date: Tue, 25 Apr 2006 15:43:10 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID a1d0761b59ca64f81b25f6254ab459529aa55758
# Parent  428babd7c1e0a51aadb03a4af2e5607a364aebd8
Change the xenbus_map_ring_valloc() interface and implementation so
that it is buildable as a module.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

diff -r 428babd7c1e0 -r a1d0761b59ca 
linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h
--- a/linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h        Tue Apr 25 
11:12:16 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h        Tue Apr 25 
14:20:08 2006 +0100
@@ -29,6 +29,7 @@ struct pciback_device {
 
        int evtchn_irq;
 
+       struct vm_struct *sh_area;
        struct xen_pci_sharedinfo *sh_info;
 };
 
diff -r 428babd7c1e0 -r a1d0761b59ca 
linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c Tue Apr 25 11:12:16 
2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c Tue Apr 25 14:20:08 
2006 +0100
@@ -26,6 +26,7 @@ static struct pciback_device *alloc_pdev
 
        spin_lock_init(&pdev->dev_lock);
 
+       pdev->sh_area = NULL;
        pdev->sh_info = NULL;
        pdev->evtchn_irq = INVALID_EVTCHN_IRQ;
        pdev->be_watching = 0;
@@ -48,7 +49,7 @@ static void free_pdev(struct pciback_dev
                unbind_from_irqhandler(pdev->evtchn_irq, pdev);
 
        if (pdev->sh_info)
-               xenbus_unmap_ring_vfree(pdev->xdev, pdev->sh_info);
+               xenbus_unmap_ring_vfree(pdev->xdev, pdev->sh_area);
 
        pciback_release_devices(pdev);
 
@@ -63,15 +64,19 @@ static int pciback_do_attach(struct pcib
 {
        int err = 0;
        int evtchn;
+       struct vm_struct *area;
+
        dev_dbg(&pdev->xdev->dev,
                "Attaching to frontend resources - gnt_ref=%d evtchn=%d\n",
                gnt_ref, remote_evtchn);
 
-       err =
-           xenbus_map_ring_valloc(pdev->xdev, gnt_ref,
-                                  (void **)&pdev->sh_info);
-       if (err)
-               goto out;
+       area = xenbus_map_ring_valloc(pdev->xdev, gnt_ref);
+       if (IS_ERR(area)) {
+               err = PTR_ERR(area);
+               goto out;
+       }
+       pdev->sh_area = area;
+       pdev->sh_info = area->addr;
 
        err = xenbus_bind_evtchn(pdev->xdev, remote_evtchn, &evtchn);
        if (err)
diff -r 428babd7c1e0 -r a1d0761b59ca 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_backend_client.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_backend_client.c   Tue Apr 
25 11:12:16 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_backend_client.c   Tue Apr 
25 14:20:08 2006 +0100
@@ -30,21 +30,20 @@
  * IN THE SOFTWARE.
  */
 
+#include <linux/err.h>
 #include <xen/gnttab.h>
 #include <xen/xenbus.h>
 #include <xen/driver_util.h>
 
 /* Based on Rusty Russell's skeleton driver's map_page */
-int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void 
**vaddr)
+struct vm_struct *xenbus_map_ring_valloc(struct xenbus_device *dev, int 
gnt_ref)
 {
        struct gnttab_map_grant_ref op;
        struct vm_struct *area;
 
-       *vaddr = NULL;
-
        area = alloc_vm_area(PAGE_SIZE);
        if (!area)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
 
        gnttab_set_map_op(&op, (unsigned long)area->addr, GNTMAP_host_map,
                          gnt_ref, dev->otherend_id);
@@ -58,14 +57,14 @@ int xenbus_map_ring_valloc(struct xenbus
                xenbus_dev_fatal(dev, op.status,
                                 "mapping in shared page %d from domain %d",
                                 gnt_ref, dev->otherend_id);
-               return op.status;
+               BUG_ON(!IS_ERR(ERR_PTR(op.status)));
+               return ERR_PTR(op.status);
        }
 
        /* Stuff the handle in an unused field */
        area->phys_addr = (unsigned long)op.handle;
 
-       *vaddr = area->addr;
-       return 0;
+       return area;
 }
 EXPORT_SYMBOL_GPL(xenbus_map_ring_valloc);
 
@@ -92,29 +91,9 @@ EXPORT_SYMBOL_GPL(xenbus_map_ring);
 
 
 /* Based on Rusty Russell's skeleton driver's unmap_page */
-int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
+int xenbus_unmap_ring_vfree(struct xenbus_device *dev, struct vm_struct *area)
 {
-       struct vm_struct *area;
        struct gnttab_unmap_grant_ref op;
-
-       /* It'd be nice if linux/vmalloc.h provided a find_vm_area(void *addr)
-        * method so that we don't have to muck with vmalloc internals here.
-        * We could force the user to hang on to their struct vm_struct from
-        * xenbus_map_ring_valloc, but these 6 lines considerably simplify
-        * this API.
-        */
-       read_lock(&vmlist_lock);
-       for (area = vmlist; area != NULL; area = area->next) {
-               if (area->addr == vaddr)
-                       break;
-       }
-       read_unlock(&vmlist_lock);
-
-       if (!area) {
-               xenbus_dev_error(dev, -ENOENT,
-                                "can't find mapped virtual address %p", vaddr);
-               return GNTST_bad_virt_addr;
-       }
 
        gnttab_set_unmap_op(&op, (unsigned long)vaddr, GNTMAP_host_map,
                            (grant_handle_t)area->phys_addr);
diff -r 428babd7c1e0 -r a1d0761b59ca linux-2.6-xen-sparse/include/xen/xenbus.h
--- a/linux-2.6-xen-sparse/include/xen/xenbus.h Tue Apr 25 11:12:16 2006 +0100
+++ b/linux-2.6-xen-sparse/include/xen/xenbus.h Tue Apr 25 14:20:08 2006 +0100
@@ -228,8 +228,8 @@ int xenbus_grant_ring(struct xenbus_devi
  * or -ENOMEM on error. If an error is returned, device will switch to
  * XenbusStateClosing and the error message will be saved in XenStore.
  */
-int xenbus_map_ring_valloc(struct xenbus_device *dev,
-                          int gnt_ref, void **vaddr);
+struct vm_struct *xenbus_map_ring_valloc(struct xenbus_device *dev,
+                                        int gnt_ref);
 int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref,
                           grant_handle_t *handle, void *vaddr);
 
@@ -241,7 +241,7 @@ int xenbus_map_ring(struct xenbus_device
  * Returns 0 on success and returns GNTST_* on error
  * (see xen/include/interface/grant_table.h).
  */
-int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr);
+int xenbus_unmap_ring_vfree(struct xenbus_device *dev, struct vm_struct *);
 int xenbus_unmap_ring(struct xenbus_device *dev,
                      grant_handle_t handle, void *vaddr);
 

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

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