diff options
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/mm/memory.c b/mm/memory.c index fc1987dfd8cc..e18c57bdc75c 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -3869,10 +3869,11 @@ EXPORT_SYMBOL_GPL(generic_access_phys); | |||
3869 | * given task for page fault accounting. | 3869 | * given task for page fault accounting. |
3870 | */ | 3870 | */ |
3871 | static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, | 3871 | static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, |
3872 | unsigned long addr, void *buf, int len, int write) | 3872 | unsigned long addr, void *buf, int len, unsigned int gup_flags) |
3873 | { | 3873 | { |
3874 | struct vm_area_struct *vma; | 3874 | struct vm_area_struct *vma; |
3875 | void *old_buf = buf; | 3875 | void *old_buf = buf; |
3876 | int write = gup_flags & FOLL_WRITE; | ||
3876 | 3877 | ||
3877 | down_read(&mm->mmap_sem); | 3878 | down_read(&mm->mmap_sem); |
3878 | /* ignore errors, just check how much was successfully transferred */ | 3879 | /* ignore errors, just check how much was successfully transferred */ |
@@ -3882,7 +3883,7 @@ static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, | |||
3882 | struct page *page = NULL; | 3883 | struct page *page = NULL; |
3883 | 3884 | ||
3884 | ret = get_user_pages_remote(tsk, mm, addr, 1, | 3885 | ret = get_user_pages_remote(tsk, mm, addr, 1, |
3885 | write, 1, &page, &vma); | 3886 | gup_flags, &page, &vma); |
3886 | if (ret <= 0) { | 3887 | if (ret <= 0) { |
3887 | #ifndef CONFIG_HAVE_IOREMAP_PROT | 3888 | #ifndef CONFIG_HAVE_IOREMAP_PROT |
3888 | break; | 3889 | break; |
@@ -3934,14 +3935,14 @@ static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, | |||
3934 | * @addr: start address to access | 3935 | * @addr: start address to access |
3935 | * @buf: source or destination buffer | 3936 | * @buf: source or destination buffer |
3936 | * @len: number of bytes to transfer | 3937 | * @len: number of bytes to transfer |
3937 | * @write: whether the access is a write | 3938 | * @gup_flags: flags modifying lookup behaviour |
3938 | * | 3939 | * |
3939 | * The caller must hold a reference on @mm. | 3940 | * The caller must hold a reference on @mm. |
3940 | */ | 3941 | */ |
3941 | int access_remote_vm(struct mm_struct *mm, unsigned long addr, | 3942 | int access_remote_vm(struct mm_struct *mm, unsigned long addr, |
3942 | void *buf, int len, int write) | 3943 | void *buf, int len, unsigned int gup_flags) |
3943 | { | 3944 | { |
3944 | return __access_remote_vm(NULL, mm, addr, buf, len, write); | 3945 | return __access_remote_vm(NULL, mm, addr, buf, len, gup_flags); |
3945 | } | 3946 | } |
3946 | 3947 | ||
3947 | /* | 3948 | /* |
@@ -3950,7 +3951,7 @@ int access_remote_vm(struct mm_struct *mm, unsigned long addr, | |||
3950 | * Do not walk the page table directly, use get_user_pages | 3951 | * Do not walk the page table directly, use get_user_pages |
3951 | */ | 3952 | */ |
3952 | int access_process_vm(struct task_struct *tsk, unsigned long addr, | 3953 | int access_process_vm(struct task_struct *tsk, unsigned long addr, |
3953 | void *buf, int len, int write) | 3954 | void *buf, int len, unsigned int gup_flags) |
3954 | { | 3955 | { |
3955 | struct mm_struct *mm; | 3956 | struct mm_struct *mm; |
3956 | int ret; | 3957 | int ret; |
@@ -3959,7 +3960,8 @@ int access_process_vm(struct task_struct *tsk, unsigned long addr, | |||
3959 | if (!mm) | 3960 | if (!mm) |
3960 | return 0; | 3961 | return 0; |
3961 | 3962 | ||
3962 | ret = __access_remote_vm(tsk, mm, addr, buf, len, write); | 3963 | ret = __access_remote_vm(tsk, mm, addr, buf, len, gup_flags); |
3964 | |||
3963 | mmput(mm); | 3965 | mmput(mm); |
3964 | 3966 | ||
3965 | return ret; | 3967 | return ret; |