The patch titled Subject: mm: do not use helper functions for process_madvise has been added to the -mm tree. Its filename is mm-madvise-introduce-process_madvise-syscall-an-external-memory-hinting-api-fix-fix-fix-fix-fix-fix-fix.patch This patch should soon appear at https://ozlabs.org/~akpm/mmots/broken-out/mm-madvise-introduce-process_madvise-syscall-an-external-memory-hinting-api-fix-fix-fix-fix-fix-fix-fix.patch and later at https://ozlabs.org/~akpm/mmotm/broken-out/mm-madvise-introduce-process_madvise-syscall-an-external-memory-hinting-api-fix-fix-fix-fix-fix-fix-fix.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Minchan Kim <minchan@xxxxxxxxxx> Subject: mm: do not use helper functions for process_madvise This patch removes helper functions process_madvise_vec, do_process_madvise and madv_import_iovec and use them inline. Link: https://lkml.kernel.org/r/20200921175539.GB387368@xxxxxxxxxx Signed-off-by: Minchan Kim <minchan@xxxxxxxxxx> Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- mm/madvise.c | 97 +++++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 54 deletions(-) --- a/mm/madvise.c~mm-madvise-introduce-process_madvise-syscall-an-external-memory-hinting-api-fix-fix-fix-fix-fix-fix-fix +++ a/mm/madvise.c @@ -1166,37 +1166,40 @@ SYSCALL_DEFINE3(madvise, unsigned long, return do_madvise(current->mm, start, len_in, behavior); } -static int process_madvise_vec(struct mm_struct *mm, struct iov_iter *iter, int behavior) -{ - struct iovec iovec; - int ret = 0; - - while (iov_iter_count(iter)) { - iovec = iov_iter_iovec(iter); - ret = do_madvise(mm, (unsigned long)iovec.iov_base, iovec.iov_len, behavior); - if (ret < 0) - break; - iov_iter_advance(iter, iovec.iov_len); - } - - return ret; -} - -static ssize_t do_process_madvise(int pidfd, struct iov_iter *iter, - int behavior, unsigned int flags) +SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec, + size_t, vlen, int, behavior, unsigned int, flags) { ssize_t ret; + struct iovec iovstack[UIO_FASTIOV], iovec; + struct iovec *iov = iovstack; + struct iov_iter iter; struct pid *pid; struct task_struct *task; struct mm_struct *mm; - size_t total_len = iov_iter_count(iter); + size_t total_len; + + if (flags != 0) { + ret = -EINVAL; + goto out; + } - if (flags != 0) - return -EINVAL; +#ifdef CONFIG_COMPAT + if (in_compat_syscall()) + ret = compat_import_iovec(READ, + (struct compat_iovec __user *)vec, vlen, + ARRAY_SIZE(iovstack), &iov, &iter); + else +#endif + ret = import_iovec(READ, vec, vlen, ARRAY_SIZE(iovstack), + &iov, &iter); + if (ret < 0) + goto out; pid = pidfd_get_pid(pidfd); - if (IS_ERR(pid)) - return PTR_ERR(pid); + if (IS_ERR(pid)) { + ret = PTR_ERR(pid); + goto free_iov; + } task = get_pid_task(pid, PIDTYPE_PID); if (!task) { @@ -1216,43 +1219,29 @@ static ssize_t do_process_madvise(int pi goto release_task; } - ret = process_madvise_vec(mm, iter, behavior); - if (ret >= 0) - ret = total_len - iov_iter_count(iter); + total_len = iov_iter_count(&iter); + + while (iov_iter_count(&iter)) { + iovec = iov_iter_iovec(&iter); + ret = do_madvise(mm, (unsigned long)iovec.iov_base, + iovec.iov_len, behavior); + if (ret < 0) + break; + iov_iter_advance(&iter, iovec.iov_len); + } + + if (ret == 0) + ret = total_len - iov_iter_count(&iter); mmput(mm); + return ret; + release_task: put_task_struct(task); put_pid: put_pid(pid); - return ret; -} - -static inline int madv_import_iovec(int type, const struct iovec __user *uvec, size_t nr_segs, - unsigned int fast_segs, struct iovec **iov, struct iov_iter *i) -{ -#ifdef CONFIG_COMPAT - if (in_compat_syscall()) - return compat_import_iovec(type, (struct compat_iovec __user *)uvec, nr_segs, - fast_segs, iov, i); -#endif - - return import_iovec(type, uvec, nr_segs, fast_segs, iov, i); -} - -SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec, - size_t, vlen, int, behavior, unsigned int, flags) -{ - ssize_t ret; - struct iovec iovstack[UIO_FASTIOV]; - struct iovec *iov = iovstack; - struct iov_iter iter; - - ret = madv_import_iovec(READ, vec, vlen, ARRAY_SIZE(iovstack), &iov, &iter); - if (ret < 0) - return ret; - - ret = do_process_madvise(pidfd, &iter, behavior, flags); +free_iov: kfree(iov); +out: return ret; } _ Patches currently in -mm which might be from minchan@xxxxxxxxxx are mm-validate-pmd-after-splitting.patch mm-madvise-pass-mm-to-do_madvise.patch pid-move-pidfd_get_pid-to-pidc.patch mm-madvise-introduce-process_madvise-syscall-an-external-memory-hinting-api.patch mm-madvise-introduce-process_madvise-syscall-an-external-memory-hinting-api-fix.patch mm-madvise-introduce-process_madvise-syscall-an-external-memory-hinting-api-fix-fix-fix-fix-fix.patch mm-madvise-introduce-process_madvise-syscall-an-external-memory-hinting-api-fix-fix-fix-fix-fix-fix-fix.patch