diff options
Diffstat (limited to 'virt/kvm/kvm_main.c')
| -rw-r--r-- | virt/kvm/kvm_main.c | 21 | 
1 files changed, 12 insertions, 9 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 81dfc73d3df3..2907b7b78654 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1346,21 +1346,19 @@ unsigned long kvm_vcpu_gfn_to_hva_prot(struct kvm_vcpu *vcpu, gfn_t gfn, bool *w  static int get_user_page_nowait(unsigned long start, int write,  		struct page **page)  { -	int flags = FOLL_TOUCH | FOLL_NOWAIT | FOLL_HWPOISON | FOLL_GET; +	int flags = FOLL_NOWAIT | FOLL_HWPOISON;  	if (write)  		flags |= FOLL_WRITE; -	return __get_user_pages(current, current->mm, start, 1, flags, page, -			NULL, NULL); +	return get_user_pages(start, 1, flags, page, NULL);  }  static inline int check_user_page_hwpoison(unsigned long addr)  { -	int rc, flags = FOLL_TOUCH | FOLL_HWPOISON | FOLL_WRITE; +	int rc, flags = FOLL_HWPOISON | FOLL_WRITE; -	rc = __get_user_pages(current, current->mm, addr, 1, -			      flags, NULL, NULL, NULL); +	rc = get_user_pages(addr, 1, flags, NULL, NULL);  	return rc == -EHWPOISON;  } @@ -1416,10 +1414,15 @@ static int hva_to_pfn_slow(unsigned long addr, bool *async, bool write_fault,  		down_read(¤t->mm->mmap_sem);  		npages = get_user_page_nowait(addr, write_fault, page);  		up_read(¤t->mm->mmap_sem); -	} else +	} else { +		unsigned int flags = FOLL_TOUCH | FOLL_HWPOISON; + +		if (write_fault) +			flags |= FOLL_WRITE; +  		npages = __get_user_pages_unlocked(current, current->mm, addr, 1, -						   write_fault, 0, page, -						   FOLL_TOUCH|FOLL_HWPOISON); +						   page, flags); +	}  	if (npages != 1)  		return npages;  | 
