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 -3.0-testing <patchbot-3.0-testing@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 25 Apr 2006 21:26:18 +0000
Delivery-date: Tue, 25 Apr 2006 14:27:19 -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 2ba859d51899470f6084188e955cf0f0c90b45f3
# Parent  775f86b6afc38c193b0032123c793a2d7e16bf73
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 775f86b6afc3 -r 2ba859d51899 
linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h
--- a/linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h        Mon Apr 24 
20:29:36 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h        Tue Apr 25 
14:30:16 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 775f86b6afc3 -r 2ba859d51899 
linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c
--- a/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c Mon Apr 24 20:29:36 
2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c Tue Apr 25 14:30:16 
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 775f86b6afc3 -r 2ba859d51899 
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   Mon Apr 
24 20:29:36 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_backend_client.c   Tue Apr 
25 14:30:16 2006 +0100
@@ -30,12 +30,13 @@
  * 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 = {
                .flags = GNTMAP_host_map,
@@ -44,11 +45,9 @@ int xenbus_map_ring_valloc(struct xenbus
        };
        struct vm_struct *area;
 
-       *vaddr = NULL;
-
        area = alloc_vm_area(PAGE_SIZE);
        if (!area)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
 
        op.host_addr = (unsigned long)area->addr;
 
@@ -61,14 +60,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);
 
@@ -98,33 +97,12 @@ 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 = {
-               .host_addr = (unsigned long)vaddr,
+               .host_addr = (unsigned long)area->addr,
+               .handle = (grant_handle_t)area->phys_addr
        };
-
-       /* 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;
-       }
-
-       op.handle = (grant_handle_t)area->phys_addr;
 
        lock_vm_area(area);
        BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
diff -r 775f86b6afc3 -r 2ba859d51899 linux-2.6-xen-sparse/include/xen/xenbus.h
--- a/linux-2.6-xen-sparse/include/xen/xenbus.h Mon Apr 24 20:29:36 2006 +0100
+++ b/linux-2.6-xen-sparse/include/xen/xenbus.h Tue Apr 25 14:30:16 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>