From: Iouri Tarassov <[email protected]>

Pages, which are obtained by calling get_user_pages(), can be evicted from 
memory.
pin_user_pages() should be used for memory, which is accessed by DMA.

Signed-off-by: Iouri Tarassov <[email protected]>
---
 drivers/hv/dxgkrnl/dxgadapter.c |  2 +-
 drivers/hv/dxgkrnl/dxgvmbus.c   | 12 ++++++++----
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/hv/dxgkrnl/dxgadapter.c b/drivers/hv/dxgkrnl/dxgadapter.c
index cf946e476411..c94283b09fa1 100644
--- a/drivers/hv/dxgkrnl/dxgadapter.c
+++ b/drivers/hv/dxgkrnl/dxgadapter.c
@@ -882,7 +882,7 @@ struct dxgallocation *dxgallocation_create(struct 
dxgprocess *process)
 void dxgallocation_stop(struct dxgallocation *alloc)
 {
        if (alloc->pages) {
-               release_pages(alloc->pages, alloc->num_pages);
+               unpin_user_pages(alloc->pages, alloc->num_pages);
                vfree(alloc->pages);
                alloc->pages = NULL;
        }
diff --git a/drivers/hv/dxgkrnl/dxgvmbus.c b/drivers/hv/dxgkrnl/dxgvmbus.c
index 467e7707c8c7..abb6d2af89ac 100644
--- a/drivers/hv/dxgkrnl/dxgvmbus.c
+++ b/drivers/hv/dxgkrnl/dxgvmbus.c
@@ -1457,6 +1457,7 @@ int create_existing_sysmem(struct dxgdevice *device,
        u64 *pfn;
        u32 pages_to_send;
        u32 i;
+       u32 gup_flags = FOLL_LONGTERM;
        struct dxgglobal *dxgglobal = dxggbl();
 
        /*
@@ -1475,12 +1476,15 @@ int create_existing_sysmem(struct dxgdevice *device,
                ret = -ENOMEM;
                goto cleanup;
        }
-       ret1 = get_user_pages_fast((unsigned long)sysmem, npages, !read_only,
-                                 dxgalloc->pages);
+       if (!read_only)
+               gup_flags |= FOLL_WRITE;
+       ret1 = pin_user_pages_fast((unsigned long)sysmem, npages, gup_flags,
+                                  dxgalloc->pages);
        if (ret1 != npages) {
                DXG_ERR("get_user_pages_fast failed: %d", ret1);
-               if (ret1 > 0 && ret1 < npages)
-                       release_pages(dxgalloc->pages, ret1);
+               if (ret1 > 0 && ret1 < npages) {
+                       unpin_user_pages(dxgalloc->pages, ret1);
+               }
                vfree(dxgalloc->pages);
                dxgalloc->pages = NULL;
                ret = -ENOMEM;

Reply via email to