# HG changeset patch # User yamahata@xxxxxxxxxxxxx # Node ID 3b76ecb1f8b94db70dbb801ff9c50f9f897aa67f # Parent 81bc9e9fb40ddd5c4366da8f7b667363005b1f92 make grant table map/unmap argument, host_addr, feature-specific. introduce gnttab_set_map_grant_ref() and gnttab_set_unmap_grant_ref() to initialize. diff -r 81bc9e9fb40d -r 3b76ecb1f8b9 linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c --- a/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c Sun Apr 9 18:23:16 2006 +0100 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c Mon Apr 10 21:33:45 2006 +0900 @@ -186,9 +186,8 @@ static void fast_flush_area(pending_req_ 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_grant_ref(&unmap[i], vaddr(req, i), 0, + handle); pending_handle(req, i) = BLKBACK_INVALID_HANDLE; invcount++; } @@ -384,6 +383,8 @@ static void dispatch_rw_block_io(blkif_t 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,12 @@ static void dispatch_rw_block_io(blkif_t 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_grant_ref(&map[i], vaddr(pending_req, i), 0, + flags, req->seg[i].gref, + blkif->domid); } ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map, nseg); diff -r 81bc9e9fb40d -r 3b76ecb1f8b9 linux-2.6-xen-sparse/drivers/xen/blkback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c Sun Apr 9 18:23:16 2006 +0100 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c Mon Apr 10 21:33:45 2006 +0900 @@ -58,10 +58,9 @@ static int map_frontend_page(blkif_t *bl 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_grant_ref(&op, + (unsigned long)blkif->blk_ring_area->addr, 0, + 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 +89,9 @@ static void unmap_frontend_page(blkif_t 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_grant_ref(&op, + (unsigned long)blkif->blk_ring_area->addr, + 0, blkif->shmem_handle); lock_vm_area(blkif->blk_ring_area); ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1); diff -r 81bc9e9fb40d -r 3b76ecb1f8b9 linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c --- a/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c Sun Apr 9 18:23:16 2006 +0100 +++ b/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c Mon Apr 10 21:33:45 2006 +0900 @@ -418,9 +418,9 @@ static void fast_flush_area(int idx, int 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_grant_ref(&unmap[op], + MMAP_VADDR(mmap_vstart, idx, i), 0, + handle->kernel); op++; if (create_lookup_pte_addr( @@ -430,9 +430,7 @@ static void fast_flush_area(int idx, int 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, 0, handle->user); op++; BLKTAP_INVALIDATE_HANDLE(handle); @@ -703,15 +701,14 @@ static void dispatch_rw_block_io(blkif_t 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; + gnttab_set_map_grant_ref(&map[op], kvaddr, 0, GNTMAP_host_map, + req->seg[i].gref, blkif->domid); /* 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 @@ -728,14 +725,13 @@ static void dispatch_rw_block_io(blkif_t 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_grant_ref(&map[op], ptep, 0, flags, + req->seg[i].gref, blkif->domid); op++; } diff -r 81bc9e9fb40d -r 3b76ecb1f8b9 linux-2.6-xen-sparse/drivers/xen/blktap/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c Sun Apr 9 18:23:16 2006 +0100 +++ b/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c Mon Apr 10 21:33:45 2006 +0900 @@ -33,10 +33,9 @@ static int map_frontend_page(blkif_t *bl 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_grant_ref(&op, + (unsigned long)blkif->blk_ring_area->addr, 0, + 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 +58,9 @@ static void unmap_frontend_page(blkif_t 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_grant_ref(&op, + (unsigned long)blkif->blk_ring_area->addr, + 0, blkif->shmem_handle); lock_vm_area(blkif->blk_ring_area); ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1); diff -r 81bc9e9fb40d -r 3b76ecb1f8b9 linux-2.6-xen-sparse/drivers/xen/netback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Sun Apr 9 18:23:16 2006 +0100 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Mon Apr 10 21:33:45 2006 +0900 @@ -150,10 +150,9 @@ static int map_frontend_pages( 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_grant_ref(&op, + (unsigned long)netif->tx_comms_area->addr, 0, + 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 +167,9 @@ static int map_frontend_pages( 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_grant_ref(&op, + (unsigned long)netif->rx_comms_area->addr, 0, + 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 +192,18 @@ static void unmap_frontend_pages(netif_t 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_grant_ref(&op, + (unsigned long)netif->tx_comms_area->addr, + 0, 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_grant_ref(&op, + (unsigned long)netif->rx_comms_area->addr, + 0, netif->rx_shmem_handle); lock_vm_area(netif->rx_comms_area); ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1); diff -r 81bc9e9fb40d -r 3b76ecb1f8b9 linux-2.6-xen-sparse/drivers/xen/netback/netback.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Sun Apr 9 18:23:16 2006 +0100 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Mon Apr 10 21:33:45 2006 +0900 @@ -453,9 +453,8 @@ inline static void net_tx_action_dealloc 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_grant_ref(gop, MMAP_VADDR(pending_idx), 0, + grant_tx_handle[pending_idx]); gop++; } ret = HYPERVISOR_grant_table_op( @@ -579,10 +578,9 @@ static void net_tx_action(unsigned long /* 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_grant_ref(mop, MMAP_VADDR(pending_idx), 0, + GNTMAP_host_map | GNTMAP_readonly, + txreq.gref, netif->domid); mop++; memcpy(&pending_tx_info[pending_idx].req, diff -r 81bc9e9fb40d -r 3b76ecb1f8b9 linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Sun Apr 9 18:23:16 2006 +0100 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Mon Apr 10 21:33:45 2006 +0900 @@ -72,12 +72,10 @@ static int map_frontend_page(tpmif_t *tp 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_grant_ref(&op, (unsigned long)tpmif->tx_area->addr, 0, + 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 +98,8 @@ static void unmap_frontend_page(tpmif_t 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_grant_ref(&op, (unsigned long)tpmif->tx_area->addr, 0, + tpmif->shmem_handle); lock_vm_area(tpmif->tx_area); ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1); diff -r 81bc9e9fb40d -r 3b76ecb1f8b9 linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c Sun Apr 9 18:23:16 2006 +0100 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c Mon Apr 10 21:33:45 2006 +0900 @@ -278,10 +278,9 @@ int _packet_write(struct packet *pak, 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_grant_ref(&map_op, MMAP_VADDR(tpmif, i), 0, + GNTMAP_host_map, tx->ref, + tpmif->domid); if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &map_op, 1))) { @@ -308,9 +307,8 @@ int _packet_write(struct packet *pak, } tx->size = tocopy; - unmap_op.host_addr = MMAP_VADDR(tpmif, i); - unmap_op.handle = handle; - unmap_op.dev_bus_addr = 0; + gnttab_set_unmap_grant_ref(&unmap_op, MMAP_VADDR(tpmif, i), 0, + handle); if (unlikely (HYPERVISOR_grant_table_op @@ -422,10 +420,9 @@ static int packet_read_shmem(struct pack 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_grant_ref(&map_op, MMAP_VADDR(tpmif, i), 0, + GNTMAP_host_map, tx->ref, + tpmif->domid); if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &map_op, 1))) { @@ -461,9 +458,8 @@ static int packet_read_shmem(struct pack 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_grant_ref(&unmap_op, MMAP_VADDR(tpmif, i), 0, + handle); if (unlikely (HYPERVISOR_grant_table_op diff -r 81bc9e9fb40d -r 3b76ecb1f8b9 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Sun Apr 9 18:23:16 2006 +0100 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Mon Apr 10 21:33:45 2006 +0900 @@ -264,11 +264,7 @@ int xenbus_free_evtchn(struct xenbus_dev /* 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; @@ -277,8 +273,9 @@ int xenbus_map_ring_valloc(struct xenbus if (!area) return -ENOMEM; - op.host_addr = (unsigned long)area->addr; - + gnttab_set_map_grant_ref(&op, (unsigned long)area->addr, 0, + 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); @@ -303,13 +300,10 @@ int xenbus_map_ring(struct xenbus_device 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_grant_ref(&op, (unsigned long)vaddr, 0, 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) { @@ -328,9 +322,7 @@ int xenbus_unmap_ring_vfree(struct xenbu 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. @@ -351,7 +343,8 @@ int xenbus_unmap_ring_vfree(struct xenbu return GNTST_bad_virt_addr; } - op.handle = (grant_handle_t)area->phys_addr; + gnttab_set_unmap_grant_ref(&op, (unsigned long)vaddr, 0, + (grant_handle_t)area->phys_addr); lock_vm_area(area); BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); @@ -372,11 +365,9 @@ int xenbus_unmap_ring(struct xenbus_devi 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_grant_ref(&op, (unsigned long)vaddr, 0, handle); BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); if (op.status != GNTST_okay) diff -r 81bc9e9fb40d -r 3b76ecb1f8b9 linux-2.6-xen-sparse/include/xen/gnttab.h --- a/linux-2.6-xen-sparse/include/xen/gnttab.h Sun Apr 9 18:23:16 2006 +0100 +++ b/linux-2.6-xen-sparse/include/xen/gnttab.h Mon Apr 10 21:33:45 2006 +0900 @@ -40,6 +40,7 @@ #include #include #include +#include /* NR_GRANT_FRAMES must be less than or equal to that configured in Xen */ #ifdef __ia64__ @@ -113,6 +114,41 @@ int gnttab_suspend(void); int gnttab_suspend(void); int gnttab_resume(void); +static inline void +gnttab_set_map_grant_ref(struct gnttab_map_grant_ref *map, + unsigned long virt, unsigned long phys, + uint32_t flags, grant_ref_t ref, domid_t domid) +{ + if (xen_feature(XENFEAT_auto_translated_physmap)) { + if (phys) + map->host_addr = phys; + else + map->host_addr = __pa(virt); + } else + map->host_addr = virt; + + map->flags = flags; + map->ref = ref; + map->dom = domid; +} + +static inline void +gnttab_set_unmap_grant_ref(struct gnttab_unmap_grant_ref *unmap, + unsigned long virt, unsigned long phys, + grant_handle_t handle) +{ + if (xen_feature(XENFEAT_auto_translated_physmap)) { + if (phys) + unmap->host_addr = phys; + else + unmap->host_addr = __pa(virt); + } else + unmap->host_addr = virt; + + unmap->handle = handle; + unmap->dev_bus_addr = 0; +} + #endif /* __ASM_GNTTAB_H__ */ /*