Commit ee9955d6 authored by Christian Brauner's avatar Christian Brauner

mm: use pidfd_get_task()

Instead of duplicating the same code in two places use the newly added
pidfd_get_task() helper. This fixes an (unimportant for now) bug where
PIDTYPE_PID is used whereas PIDTYPE_TGID should have been used.

Link: https://lore.kernel.org/r/20211004125050.1153693-3-christian.brauner@ubuntu.com
Link: https://lore.kernel.org/r/20211011133245.1703103-3-brauner@kernel.org
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Matthew Bobrowski <repnop@google.com>
Cc: Alexander Duyck <alexander.h.duyck@linux.intel.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Minchan Kim <minchan@kernel.org>
Reviewed-by: default avatarMatthew Bobrowski <repnop@google.com>
Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
Signed-off-by: default avatarChristian Brauner <christian.brauner@ubuntu.com>
parent e9bdcdbf
...@@ -1235,7 +1235,6 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec, ...@@ -1235,7 +1235,6 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec,
struct iovec iovstack[UIO_FASTIOV], iovec; struct iovec iovstack[UIO_FASTIOV], iovec;
struct iovec *iov = iovstack; struct iovec *iov = iovstack;
struct iov_iter iter; struct iov_iter iter;
struct pid *pid;
struct task_struct *task; struct task_struct *task;
struct mm_struct *mm; struct mm_struct *mm;
size_t total_len; size_t total_len;
...@@ -1250,18 +1249,12 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec, ...@@ -1250,18 +1249,12 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec,
if (ret < 0) if (ret < 0)
goto out; goto out;
pid = pidfd_get_pid(pidfd, &f_flags); task = pidfd_get_task(pidfd, &f_flags);
if (IS_ERR(pid)) { if (IS_ERR(task)) {
ret = PTR_ERR(pid); ret = PTR_ERR(task);
goto free_iov; goto free_iov;
} }
task = get_pid_task(pid, PIDTYPE_PID);
if (!task) {
ret = -ESRCH;
goto put_pid;
}
if (!process_madvise_behavior_valid(behavior)) { if (!process_madvise_behavior_valid(behavior)) {
ret = -EINVAL; ret = -EINVAL;
goto release_task; goto release_task;
...@@ -1301,8 +1294,6 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec, ...@@ -1301,8 +1294,6 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec,
mmput(mm); mmput(mm);
release_task: release_task:
put_task_struct(task); put_task_struct(task);
put_pid:
put_pid(pid);
free_iov: free_iov:
kfree(iov); kfree(iov);
out: out:
......
...@@ -1151,21 +1151,14 @@ SYSCALL_DEFINE2(process_mrelease, int, pidfd, unsigned int, flags) ...@@ -1151,21 +1151,14 @@ SYSCALL_DEFINE2(process_mrelease, int, pidfd, unsigned int, flags)
struct task_struct *p; struct task_struct *p;
unsigned int f_flags; unsigned int f_flags;
bool reap = true; bool reap = true;
struct pid *pid;
long ret = 0; long ret = 0;
if (flags) if (flags)
return -EINVAL; return -EINVAL;
pid = pidfd_get_pid(pidfd, &f_flags); task = pidfd_get_task(pidfd, &f_flags);
if (IS_ERR(pid)) if (IS_ERR(task))
return PTR_ERR(pid); return PTR_ERR(task);
task = get_pid_task(pid, PIDTYPE_TGID);
if (!task) {
ret = -ESRCH;
goto put_pid;
}
/* /*
* Make sure to choose a thread which still has a reference to mm * Make sure to choose a thread which still has a reference to mm
...@@ -1204,8 +1197,6 @@ SYSCALL_DEFINE2(process_mrelease, int, pidfd, unsigned int, flags) ...@@ -1204,8 +1197,6 @@ SYSCALL_DEFINE2(process_mrelease, int, pidfd, unsigned int, flags)
mmdrop(mm); mmdrop(mm);
put_task: put_task:
put_task_struct(task); put_task_struct(task);
put_pid:
put_pid(pid);
return ret; return ret;
#else #else
return -ENOSYS; return -ENOSYS;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment