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