Uninline find_task_by_xxx set of functions
Subsystems (7)
PATCH 1/2 Uninline find_task_by_xxx set of functions
The find_task_by_something is a set of macros are used to find task by pid depending on what kind of pid is proposed - global or virtual one. All of them are wrappers above the most generic one - find_task_by_pid_type_ns() - and just substitute some args for it.
It turned out, that dereferencing the current->nsproxy->pid_ns construction and pushing one more argument on the stack inline cause kernel text size to grow.
This patch moves all this stuff out-of-line into kernel/pid.c. Together with the next patch it saves a bit less than 400 bytes from the .text section.
Signed-off-by Pavel Emelyanov <[email protected]>
---
include/linux/sched.h +6 -9
@@ -1495,9 +1495,8 @@ extern struct pid_namespace init_pid_ns;* type and namespace specified * find_task_by_pid_ns(): * finds a task by its pid in the specified namespace -* find_task_by_pid_type(): -* finds a task by its global id with the specified type, e.g. -* by global session id +* find_task_by_vpid(): +* finds a task by its virtual pid * find_task_by_pid(): * finds a task by its global pid *
@@ -1507,12 +1506,10 @@ extern struct pid_namespace init_pid_ns;extern struct task_struct *find_task_by_pid_type_ns (int type,int pid,struct pid_namespace *ns); -#define find_task_by_pid_ns (nr, ns) \ - find_task_by_pid_type_ns(PIDTYPE_PID, nr, ns) -#define find_task_by_pid_type (type, nr) \ - find_task_by_pid_type_ns(type, nr, &init_pid_ns) -#define find_task_by_pid (nr) \ - find_task_by_pid_type(PIDTYPE_PID, nr) +extern struct task_struct *find_task_by_pid (pid_t nr); +extern struct task_struct *find_task_by_vpid (pid_t nr); +extern struct task_struct *find_task_by_pid_ns (pid_t nr, +struct pid_namespace *ns);extern void __set_special_pids (pid_t session,pid_t pgrp);
kernel/pid.c +19 -0
@@ -368,6 +380,25 @@ struct task_struct *find_task_by_pid_typEXPORT_SYMBOL (find_task_by_pid_type_ns); +struct task_struct *find_task_by_pid (pid_t nr) +{ +return find_task_by_pid_type_ns (PIDTYPE_PID , nr, &init_pid_ns); +} +EXPORT_SYMBOL (find_task_by_pid); + +struct task_struct *find_task_by_vpid (pid_t vnr) +{ +return find_task_by_pid_type_ns (PIDTYPE_PID , vnr, + current->nsproxy->pid_ns); +} +EXPORT_SYMBOL (find_task_by_vpid); + +struct task_struct *find_task_by_pid_ns (pid_t nr,struct pid_namespace *ns) +{ +return find_task_by_pid_type_ns (PIDTYPE_PID , nr, ns); +} +EXPORT_SYMBOL (find_task_by_pid_ns); +struct pid *get_task_pid (struct task_struct *task,enum pid_type type) {struct pid *pid;
fs/ioprio.c +2 -4
@@ -94,8 +94,7 @@ asmlinkage long sys_ioprio_set(int whichif (!who) p = current;else - p =find_task_by_pid_ns (who, - current->nsproxy->pid_ns); + p =find_task_by_vpid (who);if (p) ret =set_task_ioprio (p, ioprio);break ;
@@ -182,8 +181,7 @@ asmlinkage long sys_ioprio_get(int whichif (!who) p = current;else - p =find_task_by_pid_ns (who, - current->nsproxy->pid_ns); + p =find_task_by_vpid (who);if (p) ret =get_task_ioprio (p);break ;
kernel/capability.c +2 -4
@@ -63,8 +63,7 @@ asmlinkage long sys_capget(cap_user_headread_lock (&tasklist_lock);if (pid && pid !=task_pid_vnr (current)) { - target =find_task_by_pid_ns (pid, - current->nsproxy->pid_ns); + target =find_task_by_vpid (pid);if (!target) { ret = -ESRCH ; goto out;
@@ -198,8 +197,7 @@ asmlinkage long sys_capset(cap_user_headread_lock (&tasklist_lock);if (pid >0 && pid !=task_pid_vnr (current)) { - target =find_task_by_pid_ns (pid, - current->nsproxy->pid_ns); + target =find_task_by_vpid (pid);if (!target) { ret = -ESRCH ; goto out;
kernel/futex.c +2 -5
@@ -444,9 +444,7 @@ static struct task_struct * futex_find_gstruct task_struct *p;rcu_read_lock (); - p =find_task_by_pid_ns (pid, - current->nsproxy->pid_ns); - + p =find_task_by_vpid (pid);if (!p || ((current->euid != p->euid) && (current->euid != p->uid))) p =ERR_PTR (-ESRCH );else
@@ -1856,8 +1854,7 @@ sys_get_robust_list(int pid, struct robu ret = -ESRCH ;rcu_read_lock (); - p =find_task_by_pid_ns (pid, - current->nsproxy->pid_ns); + p =find_task_by_vpid (pid);if (!p) goto err_unlock; ret = -EPERM ;
kernel/futex_compat.c +1 -2
@@ -118,8 +118,7 @@ compat_sys_get_robust_list(int pid, comp ret = -ESRCH ;read_lock (&tasklist_lock); - p =find_task_by_pid_ns (pid, - current->nsproxy->pid_ns); + p =find_task_by_vpid (pid);if (!p) goto err_unlock; ret = -EPERM ;
kernel/ptrace.c +1 -2
@@ -444,8 +444,7 @@ struct task_struct *ptrace_get_task_strureturn ERR_PTR (-EPERM );read_lock (&tasklist_lock); - child =find_task_by_pid_ns (pid, - current->nsproxy->pid_ns); + child =find_task_by_vpid (pid);if (child)get_task_struct (child);
kernel/sched.c +1 -2
@@ -4156,8 +4156,7 @@ struct task_struct *idle_task(int cpu)*/ static inline struct task_struct *find_process_by_pid (pid_t pid) { -return pid ? -find_task_by_pid_ns (pid, current->nsproxy->pid_ns) : current; +return pid ?find_task_by_vpid (pid) : current; }/* Actually do priority change: must hold rq lock. */
kernel/signal.c +1 -1
@@ -2237,7 +2237,7 @@ static int do_tkill(int tgid, int pid, i info.si_uid = current->uid;read_lock (&tasklist_lock); - p =find_task_by_pid_ns (pid, current->nsproxy->pid_ns); + p =find_task_by_vpid (pid);if (p && (tgid <=0 ||task_tgid_vnr (p) == tgid)) { error =check_kill_permission (sig, &info, p);/*
kernel/sys.c +4 -5
@@ -151,8 +151,7 @@ asmlinkage long sys_setpriority(int whicswitch (which) {case PRIO_PROCESS :if (who) - p =find_task_by_pid_ns (who, - current->nsproxy->pid_ns); + p =find_task_by_vpid (who);else p = current;if (p)
@@ -209,8 +208,7 @@ asmlinkage long sys_getpriority(int whicswitch (which) {case PRIO_PROCESS :if (who) - p =find_task_by_pid_ns (who, - current->nsproxy->pid_ns); + p =find_task_by_vpid (who);else p = current;if (p) {
@@ -1065,7 +1063,8 @@ asmlinkage long sys_setsid(void)* session id and so the check will always fail and make it so * init cannot successfully call setsid. */ -if (session >1 &&find_task_by_pid_type (PIDTYPE_PGID , session)) +if (session >1 &&find_task_by_pid_type_ns (PIDTYPE_PGID , + session, &init_pid_ns)) goto out; group_leader->signal->leader =1 ;
mm/mempolicy.c +1 -2
@@ -941,8 +941,7 @@ asmlinkage long sys_migrate_pages(pid_t/* Find the mm_struct */ read_lock (&tasklist_lock); - task = pid ? -find_task_by_pid_ns (pid, current->nsproxy->pid_ns) : current; + task = pid ?find_task_by_vpid (pid) : current;if (!task) {read_unlock (&tasklist_lock);return -ESRCH ;
mm/migrate.c +1 -2
@@ -931,8 +931,7 @@ asmlinkage long sys_move_pages(pid_t pid/* Find the mm_struct */ read_lock (&tasklist_lock); - task = pid ? -find_task_by_pid_ns (pid, current->nsproxy->pid_ns) : current; + task = pid ?find_task_by_vpid (pid) : current;if (!task) {read_unlock (&tasklist_lock);return -ESRCH ;