From: Ankur Arora <ankur.a.arora@xxxxxxxxxx> GNTTABOP_map_grant_ref treats host_addr as an OUT parameter for xen_shim_domaim(). Accordingly it's updated in struct gnttab_unmap_grant_ref before it gets used via GNTTABOP_unmap_grant_ref. Co-developed-by: Joao Martins <joao.m.martins@xxxxxxxxxx> Signed-off-by: Ankur Arora <ankur.a.arora@xxxxxxxxxx> Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx> --- drivers/xen/gntdev.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c index 5efc5eee9544..8540a51f7597 100644 --- a/drivers/xen/gntdev.c +++ b/drivers/xen/gntdev.c @@ -351,6 +351,8 @@ int gntdev_map_grant_pages(struct gntdev_grant_map *map) } map->unmap_ops[i].handle = map->map_ops[i].handle; + if (xen_shim_domain()) + map->unmap_ops[i].host_addr = map->map_ops[i].host_addr; if (use_ptemod) map->kunmap_ops[i].handle = map->kmap_ops[i].handle; #ifdef CONFIG_XEN_GRANT_DMA_ALLOC @@ -1122,7 +1124,9 @@ static int gntdev_mmap(struct file *flip, struct vm_area_struct *vma) (map->flags & GNTMAP_readonly)) goto out_unlock_put; } else { - map->flags = GNTMAP_host_map; + map->flags = 0; + if (!xen_shim_domain()) + map->flags = GNTMAP_host_map; if (!(vma->vm_flags & VM_WRITE)) map->flags |= GNTMAP_readonly; } @@ -1207,7 +1211,7 @@ static int __init gntdev_init(void) { int err; - if (!xen_domain()) + if (!xen_domain() && !xen_shim_domain_get()) return -ENODEV; use_ptemod = !xen_feature(XENFEAT_auto_translated_physmap); @@ -1215,6 +1219,7 @@ static int __init gntdev_init(void) err = misc_register(&gntdev_miscdev); if (err != 0) { pr_err("Could not register gntdev device\n"); + xen_shim_domain_put(); return err; } return 0; @@ -1223,6 +1228,7 @@ static int __init gntdev_init(void) static void __exit gntdev_exit(void) { misc_deregister(&gntdev_miscdev); + xen_shim_domain_put(); } module_init(gntdev_init); -- 2.11.0