|
@@ -88,7 +88,7 @@ static int process_vm_rw_single_vec(unsigned long addr,
|
|
|
ssize_t rc = 0;
|
|
|
unsigned long max_pages_per_loop = PVM_MAX_KMALLOC_PAGES
|
|
|
/ sizeof(struct pages *);
|
|
|
- unsigned int flags = FOLL_REMOTE;
|
|
|
+ unsigned int flags = 0;
|
|
|
|
|
|
/* Work out address and page range required */
|
|
|
if (len == 0)
|
|
@@ -100,15 +100,19 @@ static int process_vm_rw_single_vec(unsigned long addr,
|
|
|
|
|
|
while (!rc && nr_pages && iov_iter_count(iter)) {
|
|
|
int pages = min(nr_pages, max_pages_per_loop);
|
|
|
+ int locked = 1;
|
|
|
size_t bytes;
|
|
|
|
|
|
/*
|
|
|
* Get the pages we're interested in. We must
|
|
|
- * add FOLL_REMOTE because task/mm might not
|
|
|
+ * access remotely because task/mm might not
|
|
|
* current/current->mm
|
|
|
*/
|
|
|
- pages = __get_user_pages_unlocked(task, mm, pa, pages,
|
|
|
- process_pages, flags);
|
|
|
+ down_read(&mm->mmap_sem);
|
|
|
+ pages = get_user_pages_remote(task, mm, pa, pages, flags,
|
|
|
+ process_pages, NULL, &locked);
|
|
|
+ if (locked)
|
|
|
+ up_read(&mm->mmap_sem);
|
|
|
if (pages <= 0)
|
|
|
return -EFAULT;
|
|
|
|