summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2011-03-02 00:46:45 +0300
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2011-04-15 02:26:24 +0400
commit5dc03639cc903f887931831d69895facb5260f4b (patch)
treea61db4e24b24295d97d4db96f1466b5e5baff85a /drivers
parent464fb419e17083a18b636c9f4714fc49ef6857d2 (diff)
downloadlinux-5dc03639cc903f887931831d69895facb5260f4b.tar.xz
xen/blkback: Utilize the M2P override mechanism for GNTMAP_host_map
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
Diffstat (limited to 'drivers')
-rw-r--r--drivers/xen/blkback/blkback.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/drivers/xen/blkback/blkback.c b/drivers/xen/blkback/blkback.c
index d32198d1be04..15790ae96f33 100644
--- a/drivers/xen/blkback/blkback.c
+++ b/drivers/xen/blkback/blkback.c
@@ -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);
}