OSDN Git Service

mm: use pidfd_get_task()
authorChristian Brauner <christian.brauner@ubuntu.com>
Mon, 11 Oct 2021 13:32:45 +0000 (15:32 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Thu, 14 Oct 2021 11:29:22 +0000 (13:29 +0200)
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: Matthew Bobrowski <repnop@google.com>
Acked-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
mm/madvise.c
mm/oom_kill.c

index 0734db8..8c92720 100644 (file)
@@ -1235,7 +1235,6 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec,
        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;
@@ -1250,18 +1249,12 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec,
        if (ret < 0)
                goto out;
 
-       pid = pidfd_get_pid(pidfd, &f_flags);
-       if (IS_ERR(pid)) {
-               ret = PTR_ERR(pid);
+       task = pidfd_get_task(pidfd, &f_flags);
+       if (IS_ERR(task)) {
+               ret = PTR_ERR(task);
                goto free_iov;
        }
 
-       task = get_pid_task(pid, PIDTYPE_PID);
-       if (!task) {
-               ret = -ESRCH;
-               goto put_pid;
-       }
-
        if (!process_madvise_behavior_valid(behavior)) {
                ret = -EINVAL;
                goto release_task;
@@ -1301,8 +1294,6 @@ release_mm:
        mmput(mm);
 release_task:
        put_task_struct(task);
-put_pid:
-       put_pid(pid);
 free_iov:
        kfree(iov);
 out:
index 831340e..70d399d 100644 (file)
@@ -1151,21 +1151,14 @@ SYSCALL_DEFINE2(process_mrelease, int, pidfd, unsigned int, flags)
        struct task_struct *p;
        unsigned int f_flags;
        bool reap = true;
-       struct pid *pid;
        long ret = 0;
 
        if (flags)
                return -EINVAL;
 
-       pid = pidfd_get_pid(pidfd, &f_flags);
-       if (IS_ERR(pid))
-               return PTR_ERR(pid);
-
-       task = get_pid_task(pid, PIDTYPE_TGID);
-       if (!task) {
-               ret = -ESRCH;
-               goto put_pid;
-       }
+       task = pidfd_get_task(pidfd, &f_flags);
+       if (IS_ERR(task))
+               return PTR_ERR(task);
 
        /*
         * Make sure to choose a thread which still has a reference to mm
@@ -1204,8 +1197,6 @@ drop_mm:
        mmdrop(mm);
 put_task:
        put_task_struct(task);
-put_pid:
-       put_pid(pid);
        return ret;
 #else
        return -ENOSYS;