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

From: Christian Brauner
Date: Tue Nov 23 2021 - 08:29:41 EST


From: Christian Brauner <christian.brauner@xxxxxxxxxx>

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 <christian.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 313c14a70bbd..9a9349048d0d 100644
--- a/block/ioprio.c
+++ b/block/ioprio.c
@@ -113,10 +113,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;
@@ -208,10 +205,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 78c351e35fec..28ce2fb581f7 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1900,6 +1900,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 919194de39c8..a674fa07a291 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -2838,14 +2838,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 523106a506ee..ef417285911d 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -4604,10 +4604,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 6f91a07a6a83..3e22f6d51815 100644
--- a/kernel/futex/syscalls.c
+++ b/kernel/futex/syscalls.c
@@ -62,13 +62,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))
@@ -348,13 +344,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 3c9b0fda64ac..01a517cba040 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -7131,17 +7131,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.
@@ -7584,7 +7573,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();
@@ -7707,7 +7696,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();
@@ -7739,7 +7728,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)
@@ -7768,7 +7757,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;
@@ -7851,7 +7840,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;
@@ -7960,7 +7949,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;
@@ -8039,7 +8028,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;

@@ -8439,7 +8428,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 517f72b008f5..9a1ef7fffc94 100644
--- a/kernel/sched/core_sched.c
+++ b/kernel/sched/core_sched.c
@@ -144,14 +144,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 8fdac0d90504..1e75b0088214 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -223,10 +223,7 @@ SYSCALL_DEFINE3(setpriority, int, which, int, who, int, niceval)
read_lock(&tasklist_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;
@@ -286,10 +283,7 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)
read_lock(&tasklist_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 10e9c87260ed..1199b9fc2250 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -1538,7 +1538,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.30.2