[resend RFC 1/3] pid: introduce task_by_pid()

From: Christian Brauner
Date: Mon Jan 24 2022 - 05:53:13 EST


We have a lot of places that open code

if (who)
p = find_task_by_vpid(who);
else
p = current;

Introduce a simpler helper which can be used instead.

Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Cc: Ingo Molnar <mingo@xxxxxxxxxx>
Cc: Jens Axboe <axboe@xxxxxxxxx>
Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
Cc: Juri Lelli <juri.lelli@xxxxxxxxxx>
Cc: Vincent Guittot <vincent.guittot@xxxxxxxxxx>
Cc: Steven Rostedt <rostedt@xxxxxxxxxxx>
Cc: Daniel Bristot de Oliveira <bristot@xxxxxxxxxx>
Cc: Tejun Heo <tj@xxxxxxxxxx>
Cc: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx>
Cc: linux-kernel@xxxxxxxxxxxxxxx
Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx>
---
arch/mips/kernel/mips-mt-fpaff.c | 14 ++-----------
arch/x86/kernel/cpu/resctrl/rdtgroup.c | 19 +++++++-----------
block/ioprio.c | 10 ++--------
include/linux/sched.h | 7 +++++++
kernel/cgroup/cgroup.c | 12 ++++--------
kernel/events/core.c | 5 +----
kernel/futex/syscalls.c | 20 ++++++-------------
kernel/pid.c | 5 +++++
kernel/sched/core.c | 27 ++++++++------------------
kernel/sched/core_sched.c | 12 ++++--------
kernel/sys.c | 12 +++---------
mm/mempolicy.c | 2 +-
12 files changed, 50 insertions(+), 95 deletions(-)

diff --git a/arch/mips/kernel/mips-mt-fpaff.c b/arch/mips/kernel/mips-mt-fpaff.c
index 67e130d3f038..53c8a56815ea 100644
--- a/arch/mips/kernel/mips-mt-fpaff.c
+++ b/arch/mips/kernel/mips-mt-fpaff.c
@@ -33,16 +33,6 @@ unsigned long mt_fpemul_threshold;
* updated when kernel/sched/core.c changes.
*/

-/*
- * find_process_by_pid - find a process with a matching PID value.
- * used in sys_sched_set/getaffinity() in kernel/sched/core.c, so
- * cloned here.
- */
-static inline struct task_struct *find_process_by_pid(pid_t pid)
-{
- return pid ? find_task_by_vpid(pid) : current;
-}
-
/*
* check the target process has a UID that matches the current process's
*/
@@ -79,7 +69,7 @@ asmlinkage long mipsmt_sys_sched_setaffinity(pid_t pid, unsigned int len,
cpus_read_lock();
rcu_read_lock();

- p = find_process_by_pid(pid);
+ p = task_by_pid(pid);
if (!p) {
rcu_read_unlock();
cpus_read_unlock();
@@ -170,7 +160,7 @@ asmlinkage long mipsmt_sys_sched_getaffinity(pid_t pid, unsigned int len,
rcu_read_lock();

retval = -ESRCH;
- p = find_process_by_pid(pid);
+ p = task_by_pid(pid);
if (!p)
goto out_unlock;
retval = security_task_getscheduler(p);
diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
index b57b3db9a6a7..577d0ffebb9d 100644
--- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c
+++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
@@ -660,19 +660,14 @@ static int rdtgroup_move_task(pid_t pid, struct rdtgroup *rdtgrp,
int ret;

rcu_read_lock();
- if (pid) {
- tsk = find_task_by_vpid(pid);
- if (!tsk) {
- rcu_read_unlock();
- rdt_last_cmd_printf("No task %d\n", pid);
- return -ESRCH;
- }
- } else {
- tsk = current;
- }
-
- get_task_struct(tsk);
+ tsk = task_by_pid(pid);
+ if (tsk)
+ get_task_struct(tsk);
rcu_read_unlock();
+ if (!tsk) {
+ rdt_last_cmd_printf("No task %d\n", pid);
+ return -ESRCH;
+ }

ret = rdtgroup_task_write_permission(tsk, of);
if (!ret)
diff --git a/block/ioprio.c b/block/ioprio.c
index 2fe068fcaad5..934e96cd495b 100644
--- a/block/ioprio.c
+++ b/block/ioprio.c
@@ -81,10 +81,7 @@ SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio)
rcu_read_lock();
switch (which) {
case IOPRIO_WHO_PROCESS:
- if (!who)
- p = current;
- else
- p = find_task_by_vpid(who);
+ p = task_by_pid(who);
if (p)
ret = set_task_ioprio(p, ioprio);
break;
@@ -176,10 +173,7 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who)
rcu_read_lock();
switch (which) {
case IOPRIO_WHO_PROCESS:
- if (!who)
- p = current;
- else
- p = find_task_by_vpid(who);
+ p = task_by_pid(who);
if (p)
ret = get_task_ioprio(p);
break;
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 508b91d57470..0408372594dd 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1912,6 +1912,13 @@ extern unsigned long init_stack[THREAD_SIZE / sizeof(unsigned long)];
*/

extern struct task_struct *find_task_by_vpid(pid_t nr);
+/**
+ * task_by_pid - find a process with a matching PID value.
+ * @pid: the pid in question.
+ *
+ * The task of @pid, if found. %NULL otherwise.
+ */
+extern struct task_struct *task_by_pid(pid_t nr);
extern struct task_struct *find_task_by_pid_ns(pid_t nr, struct pid_namespace *ns);

/*
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index b31e1465868a..3fddd5003a2b 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -2839,14 +2839,10 @@ struct task_struct *cgroup_procs_write_start(char *buf, bool threadgroup,
}

rcu_read_lock();
- if (pid) {
- tsk = find_task_by_vpid(pid);
- if (!tsk) {
- tsk = ERR_PTR(-ESRCH);
- goto out_unlock_threadgroup;
- }
- } else {
- tsk = current;
+ tsk = task_by_pid(pid);
+ if (!tsk) {
+ tsk = ERR_PTR(-ESRCH);
+ goto out_unlock_threadgroup;
}

if (threadgroup)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index fc18664f49b0..9f9ea469f1d1 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -4608,10 +4608,7 @@ find_lively_task_by_vpid(pid_t vpid)
struct task_struct *task;

rcu_read_lock();
- if (!vpid)
- task = current;
- else
- task = find_task_by_vpid(vpid);
+ task = task_by_pid(vpid);
if (task)
get_task_struct(task);
rcu_read_unlock();
diff --git a/kernel/futex/syscalls.c b/kernel/futex/syscalls.c
index 086a22d1adb7..76b5c5389214 100644
--- a/kernel/futex/syscalls.c
+++ b/kernel/futex/syscalls.c
@@ -57,13 +57,9 @@ SYSCALL_DEFINE3(get_robust_list, int, pid,
rcu_read_lock();

ret = -ESRCH;
- if (!pid)
- p = current;
- else {
- p = find_task_by_vpid(pid);
- if (!p)
- goto err_unlock;
- }
+ p = task_by_pid(pid);
+ if (!p)
+ goto err_unlock;

ret = -EPERM;
if (!ptrace_may_access(p, PTRACE_MODE_READ_REALCREDS))
@@ -326,13 +322,9 @@ COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid,
rcu_read_lock();

ret = -ESRCH;
- if (!pid)
- p = current;
- else {
- p = find_task_by_vpid(pid);
- if (!p)
- goto err_unlock;
- }
+ p = task_by_pid(pid);
+ if (!p)
+ goto err_unlock;

ret = -EPERM;
if (!ptrace_may_access(p, PTRACE_MODE_READ_REALCREDS))
diff --git a/kernel/pid.c b/kernel/pid.c
index 2fc0a16ec77b..1cd82fa58273 100644
--- a/kernel/pid.c
+++ b/kernel/pid.c
@@ -422,6 +422,11 @@ struct task_struct *find_task_by_vpid(pid_t vnr)
return find_task_by_pid_ns(vnr, task_active_pid_ns(current));
}

+struct task_struct *task_by_pid(pid_t nr)
+{
+ return nr ? find_task_by_vpid(nr) : current;
+}
+
struct task_struct *find_get_task_by_vpid(pid_t nr)
{
struct task_struct *task;
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 2e4ae00e52d1..196543f0c39a 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -7174,17 +7174,6 @@ unsigned long sched_cpu_util(int cpu, unsigned long max)
}
#endif /* CONFIG_SMP */

-/**
- * find_process_by_pid - find a process with a matching PID value.
- * @pid: the pid in question.
- *
- * The task of @pid, if found. %NULL otherwise.
- */
-static struct task_struct *find_process_by_pid(pid_t pid)
-{
- return pid ? find_task_by_vpid(pid) : current;
-}
-
/*
* sched_setparam() passes in -1 for its policy, to let the functions
* it calls know not to change it.
@@ -7627,7 +7616,7 @@ do_sched_setscheduler(pid_t pid, int policy, struct sched_param __user *param)

rcu_read_lock();
retval = -ESRCH;
- p = find_process_by_pid(pid);
+ p = task_by_pid(pid);
if (likely(p))
get_task_struct(p);
rcu_read_unlock();
@@ -7750,7 +7739,7 @@ SYSCALL_DEFINE3(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr,

rcu_read_lock();
retval = -ESRCH;
- p = find_process_by_pid(pid);
+ p = task_by_pid(pid);
if (likely(p))
get_task_struct(p);
rcu_read_unlock();
@@ -7782,7 +7771,7 @@ SYSCALL_DEFINE1(sched_getscheduler, pid_t, pid)

retval = -ESRCH;
rcu_read_lock();
- p = find_process_by_pid(pid);
+ p = task_by_pid(pid);
if (p) {
retval = security_task_getscheduler(p);
if (!retval)
@@ -7811,7 +7800,7 @@ SYSCALL_DEFINE2(sched_getparam, pid_t, pid, struct sched_param __user *, param)
return -EINVAL;

rcu_read_lock();
- p = find_process_by_pid(pid);
+ p = task_by_pid(pid);
retval = -ESRCH;
if (!p)
goto out_unlock;
@@ -7894,7 +7883,7 @@ SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr,
return -EINVAL;

rcu_read_lock();
- p = find_process_by_pid(pid);
+ p = task_by_pid(pid);
retval = -ESRCH;
if (!p)
goto out_unlock;
@@ -8003,7 +7992,7 @@ long sched_setaffinity(pid_t pid, const struct cpumask *in_mask)

rcu_read_lock();

- p = find_process_by_pid(pid);
+ p = task_by_pid(pid);
if (!p) {
rcu_read_unlock();
return -ESRCH;
@@ -8082,7 +8071,7 @@ long sched_getaffinity(pid_t pid, struct cpumask *mask)
rcu_read_lock();

retval = -ESRCH;
- p = find_process_by_pid(pid);
+ p = task_by_pid(pid);
if (!p)
goto out_unlock;

@@ -8482,7 +8471,7 @@ static int sched_rr_get_interval(pid_t pid, struct timespec64 *t)

retval = -ESRCH;
rcu_read_lock();
- p = find_process_by_pid(pid);
+ p = task_by_pid(pid);
if (!p)
goto out_unlock;

diff --git a/kernel/sched/core_sched.c b/kernel/sched/core_sched.c
index 1fb45672ec85..0c40445337c5 100644
--- a/kernel/sched/core_sched.c
+++ b/kernel/sched/core_sched.c
@@ -148,14 +148,10 @@ int sched_core_share_pid(unsigned int cmd, pid_t pid, enum pid_type type,
return -EINVAL;

rcu_read_lock();
- if (pid == 0) {
- task = current;
- } else {
- task = find_task_by_vpid(pid);
- if (!task) {
- rcu_read_unlock();
- return -ESRCH;
- }
+ task = task_by_pid(pid);
+ if (!task) {
+ rcu_read_unlock();
+ return -ESRCH;
}
get_task_struct(task);
rcu_read_unlock();
diff --git a/kernel/sys.c b/kernel/sys.c
index ecc4cf019242..9460e2eefaad 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -222,10 +222,7 @@ SYSCALL_DEFINE3(setpriority, int, which, int, who, int, niceval)
rcu_read_lock();
switch (which) {
case PRIO_PROCESS:
- if (who)
- p = find_task_by_vpid(who);
- else
- p = current;
+ p = task_by_pid(who);
if (p)
error = set_one_prio(p, niceval, error);
break;
@@ -285,10 +282,7 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)
rcu_read_lock();
switch (which) {
case PRIO_PROCESS:
- if (who)
- p = find_task_by_vpid(who);
- else
- p = current;
+ p = task_by_pid(who);
if (p) {
niceval = nice_to_rlimit(task_nice(p));
if (niceval > retval)
@@ -1659,7 +1653,7 @@ SYSCALL_DEFINE4(prlimit64, pid_t, pid, unsigned int, resource,
}

rcu_read_lock();
- tsk = pid ? find_task_by_vpid(pid) : current;
+ tsk = task_by_pid(pid);
if (!tsk) {
rcu_read_unlock();
return -ESRCH;
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 028e8dd82b44..c113e274204a 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -1613,7 +1613,7 @@ static int kernel_migrate_pages(pid_t pid, unsigned long maxnode,

/* Find the mm_struct */
rcu_read_lock();
- task = pid ? find_task_by_vpid(pid) : current;
+ task = task_by_pid(pid);
if (!task) {
rcu_read_unlock();
err = -ESRCH;
--
2.32.0