# HG changeset patch # User yamahata@xxxxxxxxxxxxx # Node ID d5f57d15427027e5e824b9a274d1040a58f275f7 # Parent f490d7d1ecce78acc40dda7644e59e7840c68ef4 grant table map/unmap use dev_bus_addr to pass pseudo physical address to xen. grant table map/unmap on Xen/x86 needs virtual address. On the other hand grant table map/unmap on Xen/IA64 needs pseudo physical address(gpaddr). use dev_bus_addr member to pass pseudo physical address. PATCHNAME: dev_bus_addr_contains_gpaddr Signed-off-by: Isaku Yamahata diff -r f490d7d1ecce -r d5f57d154270 linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c --- a/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c Mon Apr 10 16:39:49 2006 +0900 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c Mon Apr 10 16:39:53 2006 +0900 @@ -187,7 +187,7 @@ static void fast_flush_area(pending_req_ if (handle == BLKBACK_INVALID_HANDLE) continue; unmap[invcount].host_addr = vaddr(req, i); - unmap[invcount].dev_bus_addr = 0; + unmap[invcount].dev_bus_addr = __pa(unmap[invcount].host_addr); unmap[invcount].handle = handle; pending_handle(req, i) = BLKBACK_INVALID_HANDLE; invcount++; @@ -393,6 +393,7 @@ static void dispatch_rw_block_io(blkif_t preq.nr_sects += seg[i].nsec; map[i].host_addr = vaddr(pending_req, i); + map[i].dev_bus_addr = __pa(map[i].host_addr); map[i].dom = blkif->domid; map[i].ref = req->seg[i].gref; map[i].flags = GNTMAP_host_map; diff -r f490d7d1ecce -r d5f57d154270 linux-2.6-xen-sparse/drivers/xen/blkback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c Mon Apr 10 16:39:49 2006 +0900 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c Mon Apr 10 16:39:53 2006 +0900 @@ -59,6 +59,7 @@ static int map_frontend_page(blkif_t *bl int ret; op.host_addr = (unsigned long)blkif->blk_ring_area->addr; + op.dev_bus_addr = blkif->blk_ring_area->phys_addr; op.flags = GNTMAP_host_map; op.ref = shared_page; op.dom = blkif->domid; @@ -91,8 +92,8 @@ static void unmap_frontend_page(blkif_t int ret; op.host_addr = (unsigned long)blkif->blk_ring_area->addr; + op.dev_bus_addr = blkif->blk_ring_area->phys_addr; op.handle = blkif->shmem_handle; - op.dev_bus_addr = 0; lock_vm_area(blkif->blk_ring_area); ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1); diff -r f490d7d1ecce -r d5f57d154270 linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c --- a/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c Mon Apr 10 16:39:49 2006 +0900 +++ b/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c Mon Apr 10 16:39:53 2006 +0900 @@ -419,7 +419,7 @@ static void fast_flush_area(int idx, int continue; unmap[op].host_addr = MMAP_VADDR(mmap_vstart, idx, i); - unmap[op].dev_bus_addr = 0; + unmap[op].dev_bus_addr = __pa(unmap[op].host_addr); unmap[op].handle = handle->kernel; op++; @@ -431,7 +431,7 @@ static void fast_flush_area(int idx, int return; } unmap[op].host_addr = ptep; - unmap[op].dev_bus_addr = 0; + unmap[op].dev_bus_addr = __pa(unmap[op].host_addr); unmap[op].handle = handle->user; op++; @@ -709,6 +709,7 @@ static void dispatch_rw_block_io(blkif_t /* Map the remote page to kernel. */ map[op].host_addr = kvaddr; + map[op].dev_bus_addr = __pa(map[op].host_addr); map[op].dom = blkif->domid; map[op].ref = req->seg[i].gref; map[op].flags = GNTMAP_host_map; @@ -729,6 +730,7 @@ static void dispatch_rw_block_io(blkif_t } map[op].host_addr = ptep; + map[op].dev_bus_addr = __pa(map[op].host_addr); map[op].dom = blkif->domid; map[op].ref = req->seg[i].gref; map[op].flags = GNTMAP_host_map | GNTMAP_application_map diff -r f490d7d1ecce -r d5f57d154270 linux-2.6-xen-sparse/drivers/xen/blktap/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c Mon Apr 10 16:39:49 2006 +0900 +++ b/linux-2.6-xen-sparse/drivers/xen/blktap/interface.c Mon Apr 10 16:39:53 2006 +0900 @@ -34,6 +34,7 @@ static int map_frontend_page(blkif_t *bl int ret; op.host_addr = (unsigned long)blkif->blk_ring_area->addr; + op.dev_bus_addr = blkif->blk_ring_area->phys_addr; op.flags = GNTMAP_host_map; op.ref = shared_page; op.dom = blkif->domid; @@ -60,8 +61,8 @@ static void unmap_frontend_page(blkif_t int ret; op.host_addr = (unsigned long)blkif->blk_ring_area->addr; + op.dev_bus_addr = blkif->blk_ring_area->phys_addr; op.handle = blkif->shmem_handle; - op.dev_bus_addr = 0; lock_vm_area(blkif->blk_ring_area); ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1); diff -r f490d7d1ecce -r d5f57d154270 linux-2.6-xen-sparse/drivers/xen/netback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Mon Apr 10 16:39:49 2006 +0900 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Mon Apr 10 16:39:53 2006 +0900 @@ -151,6 +151,7 @@ static int map_frontend_pages( int ret; op.host_addr = (unsigned long)netif->tx_comms_area->addr; + op.dev_bus_addr = netif->tx_comms_area->phys_addr; op.flags = GNTMAP_host_map; op.ref = tx_ring_ref; op.dom = netif->domid; @@ -169,6 +170,7 @@ static int map_frontend_pages( netif->tx_shmem_handle = op.handle; op.host_addr = (unsigned long)netif->rx_comms_area->addr; + op.dev_bus_addr = netif->rx_comms_area->phys_addr; op.flags = GNTMAP_host_map; op.ref = rx_ring_ref; op.dom = netif->domid; @@ -195,8 +197,8 @@ static void unmap_frontend_pages(netif_t int ret; op.host_addr = (unsigned long)netif->tx_comms_area->addr; + op.dev_bus_addr = netif->tx_comms_area->phys_addr; op.handle = netif->tx_shmem_handle; - op.dev_bus_addr = 0; lock_vm_area(netif->tx_comms_area); ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1); @@ -204,8 +206,8 @@ static void unmap_frontend_pages(netif_t BUG_ON(ret); op.host_addr = (unsigned long)netif->rx_comms_area->addr; + op.dev_bus_addr = netif->rx_comms_area->phys_addr; op.handle = netif->rx_shmem_handle; - op.dev_bus_addr = 0; lock_vm_area(netif->rx_comms_area); ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1); diff -r f490d7d1ecce -r d5f57d154270 linux-2.6-xen-sparse/drivers/xen/netback/netback.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Mon Apr 10 16:39:49 2006 +0900 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Mon Apr 10 16:39:53 2006 +0900 @@ -454,7 +454,7 @@ inline static void net_tx_action_dealloc while (dc != dp) { pending_idx = dealloc_ring[MASK_PEND_IDX(dc++)]; gop->host_addr = MMAP_VADDR(pending_idx); - gop->dev_bus_addr = 0; + gop->dev_bus_addr = __pa(gop->host_addr); gop->handle = grant_tx_handle[pending_idx]; gop++; } @@ -580,6 +580,7 @@ static void net_tx_action(unsigned long skb_reserve(skb, 16); mop->host_addr = MMAP_VADDR(pending_idx); + mop->dev_bus_addr = __pa(mop->host_addr); mop->dom = netif->domid; mop->ref = txreq.gref; mop->flags = GNTMAP_host_map | GNTMAP_readonly; diff -r f490d7d1ecce -r d5f57d154270 linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h --- a/linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h Mon Apr 10 16:39:49 2006 +0900 +++ b/linux-2.6-xen-sparse/drivers/xen/pciback/pciback.h Mon Apr 10 16:39:53 2006 +0900 @@ -29,6 +29,7 @@ struct pciback_device { int evtchn_irq; + grant_handle_t handle; struct xen_pci_sharedinfo *sh_info; }; diff -r f490d7d1ecce -r d5f57d154270 linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c --- a/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c Mon Apr 10 16:39:49 2006 +0900 +++ b/linux-2.6-xen-sparse/drivers/xen/pciback/xenbus.c Mon Apr 10 16:39:53 2006 +0900 @@ -48,7 +48,8 @@ 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->handle, pdev->sh_info); pciback_release_devices(pdev); @@ -67,9 +68,8 @@ static int pciback_do_attach(struct pcib "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); + err = xenbus_map_ring_valloc(pdev->xdev, gnt_ref, + &pdev->handle, (void **)&pdev->sh_info); if (err) goto out; diff -r f490d7d1ecce -r d5f57d154270 linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Mon Apr 10 16:39:49 2006 +0900 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c Mon Apr 10 16:39:53 2006 +0900 @@ -74,6 +74,7 @@ static int map_frontend_page(tpmif_t *tp int ret; struct gnttab_map_grant_ref op = { .host_addr = (unsigned long)tpmif->tx_area->addr, + .dev_bus_addr = tpmif->tx_area->phys_addr, .flags = GNTMAP_host_map, .ref = shared_page, .dom = tpmif->domid, @@ -101,8 +102,8 @@ static void unmap_frontend_page(tpmif_t int ret; op.host_addr = (unsigned long)tpmif->tx_area->addr; + op.dev_bus_addr = tpmif->tx_area->phys_addr; op.handle = tpmif->shmem_handle; - op.dev_bus_addr = 0; lock_vm_area(tpmif->tx_area); ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1); diff -r f490d7d1ecce -r d5f57d154270 linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c Mon Apr 10 16:39:49 2006 +0900 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c Mon Apr 10 16:39:53 2006 +0900 @@ -279,6 +279,7 @@ int _packet_write(struct packet *pak, } map_op.host_addr = MMAP_VADDR(tpmif, i); + map_op.dev_bus_addr = __pa(map_op.host_addr); map_op.flags = GNTMAP_host_map; map_op.ref = tx->ref; map_op.dom = tpmif->domid; @@ -309,8 +310,8 @@ int _packet_write(struct packet *pak, tx->size = tocopy; unmap_op.host_addr = MMAP_VADDR(tpmif, i); + unmap_op.dev_bus_addr = __pa(unmap_op.host_addr); unmap_op.handle = handle; - unmap_op.dev_bus_addr = 0; if (unlikely (HYPERVISOR_grant_table_op @@ -423,6 +424,7 @@ static int packet_read_shmem(struct pack tx = &tpmif->tx->ring[i].req; map_op.host_addr = MMAP_VADDR(tpmif, i); + map_op.dev_bus_addr = __pa(map_op.host_addr); map_op.flags = GNTMAP_host_map; map_op.ref = tx->ref; map_op.dom = tpmif->domid; @@ -462,8 +464,8 @@ static int packet_read_shmem(struct pack buffer[offset + 2], buffer[offset + 3]); unmap_op.host_addr = MMAP_VADDR(tpmif, i); + unmap_op.dev_bus_addr = __pa(unmap_op.host_addr); unmap_op.handle = handle; - unmap_op.dev_bus_addr = 0; if (unlikely (HYPERVISOR_grant_table_op diff -r f490d7d1ecce -r d5f57d154270 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Mon Apr 10 16:39:49 2006 +0900 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Mon Apr 10 16:39:53 2006 +0900 @@ -262,7 +262,8 @@ 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) +int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, + grant_handle_t *handle, void **vaddr) { struct gnttab_map_grant_ref op = { .flags = GNTMAP_host_map, @@ -278,6 +279,7 @@ int xenbus_map_ring_valloc(struct xenbus return -ENOMEM; op.host_addr = (unsigned long)area->addr; + op.dev_bus_addr = area->phys_addr; lock_vm_area(area); BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1)); @@ -291,9 +293,7 @@ int xenbus_map_ring_valloc(struct xenbus return op.status; } - /* Stuff the handle in an unused field */ - area->phys_addr = (unsigned long)op.handle; - + *handle = op.handle; *vaddr = area->addr; return 0; } @@ -305,6 +305,7 @@ int xenbus_map_ring(struct xenbus_device { struct gnttab_map_grant_ref op = { .host_addr = (unsigned long)vaddr, + .dev_bus_addr = __pa((unsigned long)vaddr), .flags = GNTMAP_host_map, .ref = gnt_ref, .dom = dev->otherend_id, @@ -325,11 +326,13 @@ 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, + grant_handle_t handle, void *vaddr) { struct vm_struct *area; struct gnttab_unmap_grant_ref op = { .host_addr = (unsigned long)vaddr, + .handle = handle, }; /* It'd be nice if linux/vmalloc.h provided a find_vm_area(void *addr) @@ -351,7 +354,7 @@ int xenbus_unmap_ring_vfree(struct xenbu return GNTST_bad_virt_addr; } - op.handle = (grant_handle_t)area->phys_addr; + op.dev_bus_addr = area->phys_addr; lock_vm_area(area); BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); @@ -374,6 +377,7 @@ int xenbus_unmap_ring(struct xenbus_devi { struct gnttab_unmap_grant_ref op = { .host_addr = (unsigned long)vaddr, + .dev_bus_addr = __pa((unsigned long)vaddr), .handle = handle, }; diff -r f490d7d1ecce -r d5f57d154270 linux-2.6-xen-sparse/include/xen/xenbus.h --- a/linux-2.6-xen-sparse/include/xen/xenbus.h Mon Apr 10 16:39:49 2006 +0900 +++ b/linux-2.6-xen-sparse/include/xen/xenbus.h Mon Apr 10 16:39:53 2006 +0900 @@ -229,7 +229,7 @@ int xenbus_grant_ring(struct xenbus_devi * XenbusStateClosing and the error message will be saved in XenStore. */ int xenbus_map_ring_valloc(struct xenbus_device *dev, - int gnt_ref, void **vaddr); + int gnt_ref, grant_handle_t *handle, void **vaddr); int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref, grant_handle_t *handle, void *vaddr); @@ -241,7 +241,8 @@ 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, grant_handle_t handle, + void *vaddr); int xenbus_unmap_ring(struct xenbus_device *dev, grant_handle_t handle, void *vaddr); diff -r f490d7d1ecce -r d5f57d154270 xen/arch/x86/mm.c --- a/xen/arch/x86/mm.c Mon Apr 10 16:39:49 2006 +0900 +++ b/xen/arch/x86/mm.c Mon Apr 10 16:39:53 2006 +0900 @@ -2461,7 +2461,8 @@ static int destroy_grant_va_mapping( } int create_grant_host_mapping( - unsigned long addr, unsigned long frame, unsigned int flags) + unsigned long addr, unsigned long gpaddr_unused, unsigned long frame, + unsigned int flags) { l1_pgentry_t pte = l1e_from_pfn(frame, GRANT_PTE_FLAGS); @@ -2476,7 +2477,8 @@ int create_grant_host_mapping( } int destroy_grant_host_mapping( - unsigned long addr, unsigned long frame, unsigned int flags) + unsigned long addr, unsigned long gpaddr_unused, unsigned long frame, + unsigned int flags) { if ( flags & GNTMAP_contains_pte ) return destroy_grant_pte_mapping(addr, frame, current->domain); diff -r f490d7d1ecce -r d5f57d154270 xen/common/grant_table.c --- a/xen/common/grant_table.c Mon Apr 10 16:39:49 2006 +0900 +++ b/xen/common/grant_table.c Mon Apr 10 16:39:53 2006 +0900 @@ -245,7 +245,8 @@ __gnttab_map_grant_ref( if ( op->flags & GNTMAP_host_map ) { - rc = create_grant_host_mapping(op->host_addr, frame, op->flags); + rc = create_grant_host_mapping(op->host_addr, op->dev_bus_addr, + frame, op->flags); if ( rc != GNTST_okay ) { if ( !(op->flags & GNTMAP_readonly) ) @@ -335,8 +336,6 @@ __gnttab_unmap_grant_ref( ld = current->domain; - frame = (unsigned long)(op->dev_bus_addr >> PAGE_SHIFT); - map = &ld->grant_table->maptrack[op->handle]; if ( unlikely(op->handle >= ld->grant_table->maptrack_limit) || @@ -368,35 +367,26 @@ __gnttab_unmap_grant_ref( spin_lock(&rd->grant_table->lock); - if ( frame == 0 ) - { - frame = act->frame; - } - else - { - if ( unlikely(frame != act->frame) ) - PIN_FAIL(unmap_out, GNTST_general_error, - "Bad frame number doesn't match gntref.\n"); - if ( flags & GNTMAP_device_map ) - { - ASSERT(act->pin & (GNTPIN_devw_mask | GNTPIN_devr_mask)); - map->ref_and_flags &= ~GNTMAP_device_map; - if ( flags & GNTMAP_readonly ) - { - act->pin -= GNTPIN_devr_inc; - put_page(mfn_to_page(frame)); - } - else - { - act->pin -= GNTPIN_devw_inc; - put_page_and_type(mfn_to_page(frame)); - } + frame = act->frame; + if ( flags & GNTMAP_device_map ) + { + ASSERT(act->pin & (GNTPIN_devw_mask | GNTPIN_devr_mask)); + map->ref_and_flags &= ~GNTMAP_device_map; + if ( flags & GNTMAP_readonly ) + { + act->pin -= GNTPIN_devr_inc; + put_page(mfn_to_page(frame)); + } + else + { + act->pin -= GNTPIN_devw_inc; + put_page_and_type(mfn_to_page(frame)); } } if ( (op->host_addr != 0) && (flags & GNTMAP_host_map) ) { - if ( (rc = destroy_grant_host_mapping(op->host_addr, + if ( (rc = destroy_grant_host_mapping(op->host_addr, op->dev_bus_addr, frame, flags)) < 0 ) goto unmap_out; diff -r f490d7d1ecce -r d5f57d154270 xen/include/asm-ia64/grant_table.h --- a/xen/include/asm-ia64/grant_table.h Mon Apr 10 16:39:49 2006 +0900 +++ b/xen/include/asm-ia64/grant_table.h Mon Apr 10 16:39:53 2006 +0900 @@ -7,8 +7,8 @@ #define ORDER_GRANT_FRAMES 0 -#define create_grant_host_mapping(a, f, fl) 0 -#define destroy_grant_host_mapping(a, f, fl) 0 +#define create_grant_host_mapping(a, gpaddr, f, fl) 0 +#define destroy_grant_host_mapping(a, gpaddr, f, fl) 0 #define steal_page_for_grant_transfer(d, p) 0 diff -r f490d7d1ecce -r d5f57d154270 xen/include/asm-x86/grant_table.h --- a/xen/include/asm-x86/grant_table.h Mon Apr 10 16:39:49 2006 +0900 +++ b/xen/include/asm-x86/grant_table.h Mon Apr 10 16:39:53 2006 +0900 @@ -14,9 +14,11 @@ * must hold a reference to the page. */ int create_grant_host_mapping( - unsigned long addr, unsigned long frame, unsigned int flags); + unsigned long addr, unsigned long gpaddr_unused, + unsigned long frame, unsigned int flags); int destroy_grant_host_mapping( - unsigned long addr, unsigned long frame, unsigned int flags); + unsigned long addr, unsigned long gpaddr_unused, + unsigned long frame, unsigned int flags); int steal_page_for_grant_transfer( struct domain *d, struct page_info *page);