xen/blkback: Utilize the M2P override mechanism for GNTMAP_host_map
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Tue, 1 Mar 2011 21:46:45 +0000 (16:46 -0500)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Thu, 14 Apr 2011 22:26:24 +0000 (18:26 -0400)
Instead of doing copy grants lets do mapping grants using
the M2P(and P2M) override mechanism.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Conflicts:

drivers/xen/blkback/blkback.c

drivers/xen/blkback/blkback.c

index d32198d..15790ae 100644 (file)
@@ -41,7 +41,6 @@
 #include <linux/delay.h>
 #include <linux/freezer.h>
 
-#include <xen/balloon.h>
 #include <xen/events.h>
 #include <xen/page.h>
 #include <asm/xen/hypervisor.h>
@@ -192,6 +191,17 @@ static void fast_flush_area(pending_req_t *req)
        ret = HYPERVISOR_grant_table_op(
                GNTTABOP_unmap_grant_ref, unmap, invcount);
        BUG_ON(ret);
+       /* Note, we use invcount, so nr->pages, so we can't index
+        * using vaddr(req, i). */
+       for (i = 0; i < invcount; i++) {
+               ret = m2p_remove_override(
+                       virt_to_page(unmap[i].host_addr), false);
+               if (ret) {
+                       printk(KERN_ALERT "Failed to remove M2P override for " \
+                               "%lx\n", (unsigned long)unmap[i].host_addr);
+                       continue;
+               }
+       }
 }
 
 /******************************************************************
@@ -467,10 +477,15 @@ static void dispatch_rw_block_io(blkif_t *blkif,
 
                if (ret)
                        continue;
+               
+               ret = m2p_add_override(PFN_DOWN(map[i].dev_bus_addr),
+                       blkbk->pending_page(pending_req, i), false);
+               if (ret) {
+                       printk(KERN_ALERT "Failed to install M2P override for"\
+                               " %lx (ret: %d)\n", (unsigned long)map[i].dev_bus_addr, ret);
+                       continue;
+               }
 
-               set_phys_to_machine(
-                       page_to_pfn(blkbk->pending_page(pending_req, i)),
-                       FOREIGN_FRAME(map[i].dev_bus_addr >> PAGE_SHIFT));
                seg[i].buf  = map[i].dev_bus_addr |
                        (req->u.rw.seg[i].first_sect << 9);
        }