[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Make grant table map/unmap argument, host_addr, feature-specific.



# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID c3bb51c443a7a1a78a4917fd09e602fa35d9c318
# Parent  a9ae49b52c28dd961984ab8f3250572f37b4d4f2
Make grant table map/unmap argument, host_addr, feature-specific.
Introduce gnttab_set_map_op() and gnttab_set_unmap_op() to initialize.

Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>

diff -r a9ae49b52c28 -r c3bb51c443a7 
linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c        Thu Apr 13 
09:12:16 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c        Thu Apr 13 
09:29:27 2006
@@ -186,9 +186,8 @@
                handle = pending_handle(req, i);
                if (handle == BLKBACK_INVALID_HANDLE)
                        continue;
-               unmap[invcount].host_addr    = vaddr(req, i);
-               unmap[invcount].dev_bus_addr = 0;
-               unmap[invcount].handle       = handle;
+               gnttab_set_unmap_op(&unmap[i], vaddr(req, i), GNTMAP_host_map,
+                                   handle);
                pending_handle(req, i) = BLKBACK_INVALID_HANDLE;
                invcount++;
        }
@@ -384,6 +383,8 @@
        pending_req->nr_pages  = nseg;
 
        for (i = 0; i < nseg; i++) {
+               uint32_t flags;
+
                seg[i].nsec = req->seg[i].last_sect -
                        req->seg[i].first_sect + 1;
 
@@ -392,12 +393,11 @@
                        goto fail_response;
                preq.nr_sects += seg[i].nsec;
 
-               map[i].host_addr = vaddr(pending_req, i);
-               map[i].dom = blkif->domid;
-               map[i].ref = req->seg[i].gref;
-               map[i].flags = GNTMAP_host_map;
+               flags = GNTMAP_host_map;
                if ( operation == WRITE )
-                       map[i].flags |= GNTMAP_readonly;
+                       flags |= GNTMAP_readonly;
+               gnttab_set_map_op(&map[i], vaddr(pending_req, i), flags,
+                                 req->seg[i].gref, blkif->domid);
        }
 
        ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map, nseg);
diff -r a9ae49b52c28 -r c3bb51c443a7 
linux-2.6-xen-sparse/drivers/xen/blkback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c      Thu Apr 13 
09:12:16 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c      Thu Apr 13 
09:29:27 2006
@@ -58,10 +58,8 @@
        struct gnttab_map_grant_ref op;
        int ret;
 
-       op.host_addr = (unsigned long)blkif->blk_ring_area->addr;
-       op.flags     = GNTMAP_host_map;
-       op.ref       = shared_page;
-       op.dom       = blkif->domid;
+       gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr,
+                         GNTMAP_host_map, shared_page, blkif->domid);
 
        lock_vm_area(blkif->blk_ring_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
@@ -90,9 +88,8 @@
        struct gnttab_unmap_grant_ref op;
        int ret;
 
-       op.host_addr    = (unsigned long)blkif->blk_ring_area->addr;
-       op.handle       = blkif->shmem_handle;
-       op.dev_bus_addr = 0;
+       gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr,
+                           GNTMAP_host_map, blkif->shmem_handle);
 
        lock_vm_area(blkif->blk_ring_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1);
diff -r a9ae49b52c28 -r c3bb51c443a7 
linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c  Thu Apr 13 09:12:16 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c  Thu Apr 13 09:29:27 2006
@@ -418,9 +418,9 @@
                if (BLKTAP_INVALID_HANDLE(handle))
                        continue;
 
-               unmap[op].host_addr = MMAP_VADDR(mmap_vstart, idx, i);
-               unmap[op].dev_bus_addr = 0;
-               unmap[op].handle = handle->kernel;
+               gnttab_set_unmap_op(&unmap[op],
+                                   MMAP_VADDR(mmap_vstart, idx, i),
+                                   GNTMAP_host_map, handle->kernel);
                op++;
 
                if (create_lookup_pte_addr(
@@ -430,9 +430,10 @@
                        DPRINTK("Couldn't get a pte addr!\n");
                        return;
                }
-               unmap[op].host_addr    = ptep;
-               unmap[op].dev_bus_addr = 0;
-               unmap[op].handle       = handle->user;
+               gnttab_set_unmap_grnat_ref(&unmap[op], ptep,
+                                          GNTMAP_host_map |
+                                          GNTMAP_application_map |
+                                          GNTMAP_contains_pte, handle->user);
                op++;
             
                BLKTAP_INVALIDATE_HANDLE(handle);
@@ -703,21 +704,21 @@
                unsigned long uvaddr;
                unsigned long kvaddr;
                uint64_t ptep;
+               uint32_t flags;
 
                uvaddr = MMAP_VADDR(user_vstart, pending_idx, i);
                kvaddr = MMAP_VADDR(mmap_vstart, pending_idx, i);
 
-               /* Map the remote page to kernel. */
-               map[op].host_addr = kvaddr;
-               map[op].dom   = blkif->domid;
-               map[op].ref   = req->seg[i].gref;
-               map[op].flags = GNTMAP_host_map;
+               flags = GNTMAP_host_map;
                /* This needs a bit more thought in terms of interposition: 
                 * If we want to be able to modify pages during write using 
                 * grant table mappings, the guest will either need to allow 
                 * it, or we'll need to incur a copy. Bit of an fbufs moment. 
;) */
                if (req->operation == BLKIF_OP_WRITE)
-                       map[op].flags |= GNTMAP_readonly;
+                       flags |= GNTMAP_readonly;
+               /* Map the remote page to kernel. */
+               gnttab_set_map_op(&map[op], kvaddr, flags, req->seg[i].gref,
+                                 blkif->domid);
                op++;
 
                /* Now map it to user. */
@@ -728,14 +729,13 @@
                        goto bad_descriptor;
                }
 
-               map[op].host_addr = ptep;
-               map[op].dom       = blkif->domid;
-               map[op].ref       = req->seg[i].gref;
-               map[op].flags     = GNTMAP_host_map | GNTMAP_application_map
+               flags = GNTMAP_host_map | GNTMAP_application_map
                        | GNTMAP_contains_pte;
                /* Above interposition comment applies here as well. */
                if (req->operation == BLKIF_OP_WRITE)
-                       map[op].flags |= GNTMAP_readonly;
+                       flags |= GNTMAP_readonly;
+               gnttab_set_map_op(&map[op], ptep, flags, req->seg[i].gref,
+                                 blkif->domid);
                op++;
        }
 
diff -r a9ae49b52c28 -r c3bb51c443a7 
linux-2.6-xen-sparse/drivers/xen/blktap/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c       Thu Apr 13 
09:12:16 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c       Thu Apr 13 
09:29:27 2006
@@ -33,10 +33,8 @@
        struct gnttab_map_grant_ref op;
        int ret;
 
-       op.host_addr = (unsigned long)blkif->blk_ring_area->addr;
-       op.flags     = GNTMAP_host_map;
-       op.ref       = shared_page;
-       op.dom       = blkif->domid;
+       gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr,
+                         GNTMAP_host_map, shared_page, blkif->domid);
 
        lock_vm_area(blkif->blk_ring_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
@@ -59,9 +57,8 @@
        struct gnttab_unmap_grant_ref op;
        int ret;
 
-       op.host_addr    = (unsigned long)blkif->blk_ring_area->addr;
-       op.handle       = blkif->shmem_handle;
-       op.dev_bus_addr = 0;
+       gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr,
+                           GNTMAP_host_map, blkif->shmem_handle);
 
        lock_vm_area(blkif->blk_ring_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1);
diff -r a9ae49b52c28 -r c3bb51c443a7 
linux-2.6-xen-sparse/drivers/xen/netback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c      Thu Apr 13 
09:12:16 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c      Thu Apr 13 
09:29:27 2006
@@ -150,10 +150,8 @@
        struct gnttab_map_grant_ref op;
        int ret;
 
-       op.host_addr = (unsigned long)netif->tx_comms_area->addr;
-       op.flags     = GNTMAP_host_map;
-       op.ref       = tx_ring_ref;
-       op.dom       = netif->domid;
+       gnttab_set_map_op(&op, (unsigned long)netif->tx_comms_area->addr,
+                         GNTMAP_host_map, tx_ring_ref, netif->domid);
     
        lock_vm_area(netif->tx_comms_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
@@ -168,10 +166,8 @@
        netif->tx_shmem_ref    = tx_ring_ref;
        netif->tx_shmem_handle = op.handle;
 
-       op.host_addr = (unsigned long)netif->rx_comms_area->addr;
-       op.flags     = GNTMAP_host_map;
-       op.ref       = rx_ring_ref;
-       op.dom       = netif->domid;
+       gnttab_set_map_op(&op, (unsigned long)netif->rx_comms_area->addr,
+                         GNTMAP_host_map, rx_ring_ref, netif->domid);
 
        lock_vm_area(netif->rx_comms_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
@@ -194,18 +190,16 @@
        struct gnttab_unmap_grant_ref op;
        int ret;
 
-       op.host_addr    = (unsigned long)netif->tx_comms_area->addr;
-       op.handle       = netif->tx_shmem_handle;
-       op.dev_bus_addr = 0;
+       gnttab_set_unmap_op(&op, (unsigned long)netif->tx_comms_area->addr,
+                           GNTMAP_host_map, netif->tx_shmem_handle);
 
        lock_vm_area(netif->tx_comms_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1);
        unlock_vm_area(netif->tx_comms_area);
        BUG_ON(ret);
 
-       op.host_addr    = (unsigned long)netif->rx_comms_area->addr;
-       op.handle       = netif->rx_shmem_handle;
-       op.dev_bus_addr = 0;
+       gnttab_set_unmap_op(&op, (unsigned long)netif->rx_comms_area->addr,
+                           GNTMAP_host_map, netif->rx_shmem_handle);
 
        lock_vm_area(netif->rx_comms_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1);
diff -r a9ae49b52c28 -r c3bb51c443a7 
linux-2.6-xen-sparse/drivers/xen/netback/netback.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c        Thu Apr 13 
09:12:16 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c        Thu Apr 13 
09:29:27 2006
@@ -453,9 +453,9 @@
        gop = tx_unmap_ops;
        while (dc != dp) {
                pending_idx = dealloc_ring[MASK_PEND_IDX(dc++)];
-               gop->host_addr    = MMAP_VADDR(pending_idx);
-               gop->dev_bus_addr = 0;
-               gop->handle       = grant_tx_handle[pending_idx];
+               gnttab_set_unmap_op(gop, MMAP_VADDR(pending_idx),
+                                   GNTMAP_host_map,
+                                   grant_tx_handle[pending_idx]);
                gop++;
        }
        ret = HYPERVISOR_grant_table_op(
@@ -579,10 +579,9 @@
                /* Packets passed to netif_rx() must have some headroom. */
                skb_reserve(skb, 16);
 
-               mop->host_addr = MMAP_VADDR(pending_idx);
-               mop->dom       = netif->domid;
-               mop->ref       = txreq.gref;
-               mop->flags     = GNTMAP_host_map | GNTMAP_readonly;
+               gnttab_set_map_op(mop, MMAP_VADDR(pending_idx),
+                                 GNTMAP_host_map | GNTMAP_readonly,
+                                 txreq.gref, netif->domid);
                mop++;
 
                memcpy(&pending_tx_info[pending_idx].req,
diff -r a9ae49b52c28 -r c3bb51c443a7 
linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c      Thu Apr 13 
09:12:16 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c      Thu Apr 13 
09:29:27 2006
@@ -13,6 +13,7 @@
 
 #include "common.h"
 #include <xen/balloon.h>
+#include <xen/gnttab.h>
 
 static kmem_cache_t *tpmif_cachep;
 int num_frontends = 0;
@@ -72,12 +73,10 @@
 static int map_frontend_page(tpmif_t *tpmif, unsigned long shared_page)
 {
        int ret;
-       struct gnttab_map_grant_ref op = {
-               .host_addr = (unsigned long)tpmif->tx_area->addr,
-               .flags = GNTMAP_host_map,
-               .ref = shared_page,
-               .dom = tpmif->domid,
-       };
+       struct gnttab_map_grant_ref op;
+
+       gnttab_set_map_op(&op, (unsigned long)tpmif->tx_area->addr,
+                         GNTMAP_host_map, shared_page, tpmif->domid);
 
        lock_vm_area(tpmif->tx_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
@@ -100,9 +99,8 @@
        struct gnttab_unmap_grant_ref op;
        int ret;
 
-       op.host_addr    = (unsigned long)tpmif->tx_area->addr;
-       op.handle       = tpmif->shmem_handle;
-       op.dev_bus_addr = 0;
+       gnttab_set_unmap_op(&op, (unsigned long)tpmif->tx_area->addr,
+                           GNTMAP_host_map, tpmif->shmem_handle);
 
        lock_vm_area(tpmif->tx_area);
        ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1);
diff -r a9ae49b52c28 -r c3bb51c443a7 
linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c
--- a/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c        Thu Apr 13 
09:12:16 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c        Thu Apr 13 
09:29:27 2006
@@ -21,6 +21,7 @@
 #include <asm/uaccess.h>
 #include <xen/xenbus.h>
 #include <xen/interface/grant_table.h>
+#include <xen/gnttab.h>
 
 /* local data structures */
 struct data_exchange {
@@ -278,10 +279,8 @@
                        return 0;
                }
 
-               map_op.host_addr = MMAP_VADDR(tpmif, i);
-               map_op.flags = GNTMAP_host_map;
-               map_op.ref = tx->ref;
-               map_op.dom = tpmif->domid;
+               gnttab_set_map_op(&map_op, MMAP_VADDR(tpmif, i),
+                                 GNTMAP_host_map, tx->ref, tpmif->domid);
 
                if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
                                                       &map_op, 1))) {
@@ -308,9 +307,8 @@
                }
                tx->size = tocopy;
 
-               unmap_op.host_addr = MMAP_VADDR(tpmif, i);
-               unmap_op.handle = handle;
-               unmap_op.dev_bus_addr = 0;
+               gnttab_set_unmap_op(&unmap_op, MMAP_VADDR(tpmif, i),
+                                   GNTMAP_host_map, handle);
 
                if (unlikely
                    (HYPERVISOR_grant_table_op
@@ -422,10 +420,8 @@
 
                tx = &tpmif->tx->ring[i].req;
 
-               map_op.host_addr = MMAP_VADDR(tpmif, i);
-               map_op.flags = GNTMAP_host_map;
-               map_op.ref = tx->ref;
-               map_op.dom = tpmif->domid;
+               gnttab_set_map_op(&map_op, MMAP_VADDR(tpmif, i),
+                                 GNTMAP_host_map, tx->ref, tpmif->domid);
 
                if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
                                                       &map_op, 1))) {
@@ -461,9 +457,8 @@
                        tpmif->domid, buffer[offset], buffer[offset + 1],
                        buffer[offset + 2], buffer[offset + 3]);
 
-               unmap_op.host_addr = MMAP_VADDR(tpmif, i);
-               unmap_op.handle = handle;
-               unmap_op.dev_bus_addr = 0;
+               gnttab_set_unmap_op(&unmap_op, MMAP_VADDR(tpmif, i),
+                                   GNTMAP_host_map, handle);
 
                if (unlikely
                    (HYPERVISOR_grant_table_op
diff -r a9ae49b52c28 -r c3bb51c443a7 
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   Thu Apr 
13 09:12:16 2006
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_backend_client.c   Thu Apr 
13 09:29:27 2006
@@ -37,11 +37,7 @@
 /* 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 gnttab_map_grant_ref op = {
-               .flags = GNTMAP_host_map,
-               .ref   = gnt_ref,
-               .dom   = dev->otherend_id,
-       };
+       struct gnttab_map_grant_ref op;
        struct vm_struct *area;
 
        *vaddr = NULL;
@@ -50,8 +46,9 @@
        if (!area)
                return -ENOMEM;
 
-       op.host_addr = (unsigned long)area->addr;
-
+       gnttab_set_map_op(&op, (unsigned long)area->addr, GNTMAP_host_map,
+                         gnt_ref, dev->otherend_id);
+       
        lock_vm_area(area);
        BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1));
        unlock_vm_area(area);
@@ -76,13 +73,10 @@
 int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref,
                   grant_handle_t *handle, void *vaddr)
 {
-       struct gnttab_map_grant_ref op = {
-               .host_addr = (unsigned long)vaddr,
-               .flags     = GNTMAP_host_map,
-               .ref       = gnt_ref,
-               .dom       = dev->otherend_id,
-       };
-
+       struct gnttab_map_grant_ref op;
+       
+       gnttab_set_map_op(&op, (unsigned long)vaddr, GNTMAP_host_map,
+                         gnt_ref, dev->otherend_id);
        BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1));
 
        if (op.status != GNTST_okay) {
@@ -101,9 +95,7 @@
 int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
 {
        struct vm_struct *area;
-       struct gnttab_unmap_grant_ref op = {
-               .host_addr = (unsigned long)vaddr,
-       };
+       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.
@@ -124,7 +116,8 @@
                return GNTST_bad_virt_addr;
        }
 
-       op.handle = (grant_handle_t)area->phys_addr;
+       gnttab_set_unmap_op(&op, (unsigned long)vaddr, GNTMAP_host_map,
+                           (grant_handle_t)area->phys_addr);
 
        lock_vm_area(area);
        BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
@@ -145,11 +138,10 @@
 int xenbus_unmap_ring(struct xenbus_device *dev,
                     grant_handle_t handle, void *vaddr)
 {
-       struct gnttab_unmap_grant_ref op = {
-               .host_addr = (unsigned long)vaddr,
-               .handle    = handle,
-       };
+       struct gnttab_unmap_grant_ref op;
 
+       gnttab_set_unmap_op(&op, (unsigned long)vaddr, GNTMAP_host_map,
+                           handle);
        BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
 
        if (op.status != GNTST_okay)
diff -r a9ae49b52c28 -r c3bb51c443a7 linux-2.6-xen-sparse/include/xen/gnttab.h
--- a/linux-2.6-xen-sparse/include/xen/gnttab.h Thu Apr 13 09:12:16 2006
+++ b/linux-2.6-xen-sparse/include/xen/gnttab.h Thu Apr 13 09:29:27 2006
@@ -40,6 +40,7 @@
 #include <linux/config.h>
 #include <asm/hypervisor.h>
 #include <xen/interface/grant_table.h>
+#include <xen/features.h>
 
 /* NR_GRANT_FRAMES must be less than or equal to that configured in Xen */
 #ifdef __ia64__
@@ -113,6 +114,37 @@
 int gnttab_suspend(void);
 int gnttab_resume(void);
 
+static inline void
+gnttab_set_map_op(struct gnttab_map_grant_ref *map, unsigned long addr,
+                 uint32_t flags, grant_ref_t ref, domid_t domid)
+{
+       if (flags & GNTMAP_contains_pte)
+               map->host_addr = addr;
+       else if (xen_feature(XENFEAT_auto_translated_physmap))
+               map->host_addr = __pa(addr);
+       else
+               map->host_addr = addr;
+
+       map->flags = flags;
+       map->ref = ref;
+       map->dom = domid;
+}
+
+static inline void
+gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, unsigned long addr,
+                   uint32_t flags, grant_handle_t handle)
+{
+       if (flags & GNTMAP_contains_pte)
+               unmap->host_addr = addr;
+       else if (xen_feature(XENFEAT_auto_translated_physmap))
+               unmap->host_addr = __pa(addr);
+       else
+               unmap->host_addr = addr;
+
+       unmap->handle = handle;
+       unmap->dev_bus_addr = 0;
+}
+
 #endif /* __ASM_GNTTAB_H__ */
 
 /*

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.