On Wed 26-10-16 00:36:09, Lorenzo Stoakes wrote:
> In hva_to_pfn_slow() we are able to replace __get_user_pages_unlocked() with
> get_user_pages_unlocked() since we can now pass gup_flags.
> 
> In async_pf_execute() we need to pass different tsk, mm arguments so
> get_user_pages_remote() is the sane replacement here (having added manual
> acquisition and release of mmap_sem.)

please also add a note about the FOLL_TOUCH reintroduced after it has
been dropped by 1e9877902dc7e silently
 
> Since we pass a NULL pages parameter the subsequent call to
> __get_user_pages_locked() will have previously bailed any attempt at
> VM_FAULT_RETRY, so we do not change this behaviour by using
> get_user_pages_remote() which does not invoke VM_FAULT_RETRY logic at all.
> 
> Signed-off-by: Lorenzo Stoakes <lstoa...@gmail.com>

Acked-by: Michal Hocko <mho...@suse.com>

> ---
>  virt/kvm/async_pf.c | 7 ++++---
>  virt/kvm/kvm_main.c | 5 ++---
>  2 files changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/virt/kvm/async_pf.c b/virt/kvm/async_pf.c
> index 8035cc1..e8c832c 100644
> --- a/virt/kvm/async_pf.c
> +++ b/virt/kvm/async_pf.c
> @@ -82,10 +82,11 @@ static void async_pf_execute(struct work_struct *work)
>       /*
>        * This work is run asynchromously to the task which owns
>        * mm and might be done in another context, so we must
> -      * use FOLL_REMOTE.
> +      * access remotely.
>        */
> -     __get_user_pages_unlocked(NULL, mm, addr, 1, NULL,
> -                     FOLL_WRITE | FOLL_REMOTE);
> +     down_read(&mm->mmap_sem);
> +     get_user_pages_remote(NULL, mm, addr, 1, FOLL_WRITE, NULL, NULL);
> +     up_read(&mm->mmap_sem);
> 
>       kvm_async_page_present_sync(vcpu, apf);
> 
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 2907b7b..c45d951 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -1415,13 +1415,12 @@ static int hva_to_pfn_slow(unsigned long addr, bool 
> *async, bool write_fault,
>               npages = get_user_page_nowait(addr, write_fault, page);
>               up_read(&current->mm->mmap_sem);
>       } else {
> -             unsigned int flags = FOLL_TOUCH | FOLL_HWPOISON;
> +             unsigned int flags = FOLL_HWPOISON;
> 
>               if (write_fault)
>                       flags |= FOLL_WRITE;
> 
> -             npages = __get_user_pages_unlocked(current, current->mm, addr, 
> 1,
> -                                                page, flags);
> +             npages = get_user_pages_unlocked(addr, 1, page, flags);
>       }
>       if (npages != 1)
>               return npages;
> --
> 2.10.1

-- 
Michal Hocko
SUSE Labs

Reply via email to