xen/gntdev: Do not use mm notifiers with autotranslating guests
authorBoris Ostrovsky <boris.ostrovsky@oracle.com>
Tue, 28 Jan 2020 15:31:26 +0000 (10:31 -0500)
committerBoris Ostrovsky <boris.ostrovsky@oracle.com>
Tue, 28 Jan 2020 18:22:48 +0000 (12:22 -0600)
Commit d3eeb1d77c5d ("xen/gntdev: use mmu_interval_notifier_insert")
missed a test for use_ptemod when calling mmu_interval_read_begin(). Fix
that.

Fixes: d3eeb1d77c5d ("xen/gntdev: use mmu_interval_notifier_insert")
CC: stable@vger.kernel.org # 5.5
Reported-by: Ilpo Järvinen <ilpo.jarvinen@cs.helsinki.fi>
Tested-by: Ilpo Järvinen <ilpo.jarvinen@cs.helsinki.fi>
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reviewed-by: Jason Gunthorpe <jgg@mellanox.com>
Acked-by: Juergen Gross <jgross@suse.com>
drivers/xen/gntdev.c

index 4fc83e3f5ad3d3ee838f7c03749db1855868a947..0258415ca0b2481335adf7d3cfd9990d8a0e1392 100644 (file)
@@ -1006,19 +1006,19 @@ static int gntdev_mmap(struct file *flip, struct vm_area_struct *vma)
        }
        mutex_unlock(&priv->lock);
 
-       /*
-        * gntdev takes the address of the PTE in find_grant_ptes() and passes
-        * it to the hypervisor in gntdev_map_grant_pages(). The purpose of
-        * the notifier is to prevent the hypervisor pointer to the PTE from
-        * going stale.
-        *
-        * Since this vma's mappings can't be touched without the mmap_sem,
-        * and we are holding it now, there is no need for the notifier_range
-        * locking pattern.
-        */
-       mmu_interval_read_begin(&map->notifier);
-
        if (use_ptemod) {
+               /*
+                * gntdev takes the address of the PTE in find_grant_ptes() and
+                * passes it to the hypervisor in gntdev_map_grant_pages(). The
+                * purpose of the notifier is to prevent the hypervisor pointer
+                * to the PTE from going stale.
+                *
+                * Since this vma's mappings can't be touched without the
+                * mmap_sem, and we are holding it now, there is no need for
+                * the notifier_range locking pattern.
+                */
+               mmu_interval_read_begin(&map->notifier);
+
                map->pages_vm_start = vma->vm_start;
                err = apply_to_page_range(vma->vm_mm, vma->vm_start,
                                          vma->vm_end - vma->vm_start,