Commit 7a36094d authored by Eric W. Biederman's avatar Eric W. Biederman

pids: Compute task_tgid using signal->leader_pid

The cost is the the same and this removes the need
to worry about complications that come from de_thread
and group_leader changing.

__task_pid_nr_ns has been updated to take advantage of this change.
Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
parent 1fb53567
...@@ -50,7 +50,6 @@ void foo(void) ...@@ -50,7 +50,6 @@ void foo(void)
DEFINE(IA64_TASK_BLOCKED_OFFSET,offsetof (struct task_struct, blocked)); DEFINE(IA64_TASK_BLOCKED_OFFSET,offsetof (struct task_struct, blocked));
DEFINE(IA64_TASK_CLEAR_CHILD_TID_OFFSET,offsetof (struct task_struct, clear_child_tid)); DEFINE(IA64_TASK_CLEAR_CHILD_TID_OFFSET,offsetof (struct task_struct, clear_child_tid));
DEFINE(IA64_TASK_GROUP_LEADER_OFFSET, offsetof (struct task_struct, group_leader));
DEFINE(IA64_TASK_TGIDLINK_OFFSET, offsetof (struct task_struct, pids[PIDTYPE_PID].pid)); DEFINE(IA64_TASK_TGIDLINK_OFFSET, offsetof (struct task_struct, pids[PIDTYPE_PID].pid));
DEFINE(IA64_PID_LEVEL_OFFSET, offsetof (struct pid, level)); DEFINE(IA64_PID_LEVEL_OFFSET, offsetof (struct pid, level));
DEFINE(IA64_PID_UPID_OFFSET, offsetof (struct pid, numbers[0])); DEFINE(IA64_PID_UPID_OFFSET, offsetof (struct pid, numbers[0]));
...@@ -68,6 +67,7 @@ void foo(void) ...@@ -68,6 +67,7 @@ void foo(void)
DEFINE(IA64_SIGNAL_GROUP_STOP_COUNT_OFFSET,offsetof (struct signal_struct, DEFINE(IA64_SIGNAL_GROUP_STOP_COUNT_OFFSET,offsetof (struct signal_struct,
group_stop_count)); group_stop_count));
DEFINE(IA64_SIGNAL_SHARED_PENDING_OFFSET,offsetof (struct signal_struct, shared_pending)); DEFINE(IA64_SIGNAL_SHARED_PENDING_OFFSET,offsetof (struct signal_struct, shared_pending));
DEFINE(IA64_SIGNAL_LEADER_PID_OFFSET, offsetof (struct signal_struct, leader_pid));
BLANK(); BLANK();
......
...@@ -62,16 +62,16 @@ ENTRY(fsys_getpid) ...@@ -62,16 +62,16 @@ ENTRY(fsys_getpid)
.prologue .prologue
.altrp b6 .altrp b6
.body .body
add r17=IA64_TASK_GROUP_LEADER_OFFSET,r16 add r17=IA64_TASK_SIGNAL_OFFSET,r16
;; ;;
ld8 r17=[r17] // r17 = current->group_leader ld8 r17=[r17] // r17 = current->signal
add r9=TI_FLAGS+IA64_TASK_SIZE,r16 add r9=TI_FLAGS+IA64_TASK_SIZE,r16
;; ;;
ld4 r9=[r9] ld4 r9=[r9]
add r17=IA64_TASK_TGIDLINK_OFFSET,r17 add r17=IA64_SIGNAL_LEADER_PID_OFFSET,r17
;; ;;
and r9=TIF_ALLWORK_MASK,r9 and r9=TIF_ALLWORK_MASK,r9
ld8 r17=[r17] // r17 = current->group_leader->pids[PIDTYPE_PID].pid ld8 r17=[r17] // r17 = current->signal->leader_pid
;; ;;
add r8=IA64_PID_LEVEL_OFFSET,r17 add r8=IA64_PID_LEVEL_OFFSET,r17
;; ;;
......
...@@ -57,6 +57,7 @@ ...@@ -57,6 +57,7 @@
#include <linux/list.h> #include <linux/list.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/sched/signal.h>
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/freezer.h> #include <linux/freezer.h>
#include <linux/delay.h> #include <linux/delay.h>
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/sched/signal.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/compat.h> #include <linux/compat.h>
#include <linux/swap.h> #include <linux/swap.h>
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <linux/mount.h> #include <linux/mount.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/sched/user.h> #include <linux/sched/user.h>
#include <linux/sched/signal.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/audit.h> #include <linux/audit.h>
......
...@@ -1202,11 +1202,6 @@ static inline struct pid *task_pid(struct task_struct *task) ...@@ -1202,11 +1202,6 @@ static inline struct pid *task_pid(struct task_struct *task)
return task->pids[PIDTYPE_PID].pid; return task->pids[PIDTYPE_PID].pid;
} }
static inline struct pid *task_tgid(struct task_struct *task)
{
return task->group_leader->pids[PIDTYPE_PID].pid;
}
/* /*
* Without tasklist or RCU lock it is not safe to dereference * Without tasklist or RCU lock it is not safe to dereference
* the result of task_pgrp/task_session even if task == current, * the result of task_pgrp/task_session even if task == current,
......
...@@ -564,6 +564,11 @@ struct pid *task_pid_type(struct task_struct *task, enum pid_type type) ...@@ -564,6 +564,11 @@ struct pid *task_pid_type(struct task_struct *task, enum pid_type type)
return task->pids[type].pid; return task->pids[type].pid;
} }
static inline struct pid *task_tgid(struct task_struct *task)
{
return task->signal->leader_pid;
}
static inline int get_nr_threads(struct task_struct *tsk) static inline int get_nr_threads(struct task_struct *tsk)
{ {
return tsk->signal->nr_threads; return tsk->signal->nr_threads;
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <linux/security.h> #include <linux/security.h>
#include <linux/pid.h> #include <linux/pid.h>
#include <linux/nsproxy.h> #include <linux/nsproxy.h>
#include <linux/sched/signal.h>
/* Well, we should have at least one descriptor open /* Well, we should have at least one descriptor open
* to accept passed FDs 8) * to accept passed FDs 8)
......
...@@ -421,13 +421,14 @@ pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type, ...@@ -421,13 +421,14 @@ pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type,
if (!ns) if (!ns)
ns = task_active_pid_ns(current); ns = task_active_pid_ns(current);
if (likely(pid_alive(task))) { if (likely(pid_alive(task))) {
if (type != PIDTYPE_PID) { struct pid *pid;
if (type == __PIDTYPE_TGID) if (type == PIDTYPE_PID)
type = PIDTYPE_PID; pid = task_pid(task);
else if (type == __PIDTYPE_TGID)
task = task->group_leader; pid = task_tgid(task);
} else
nr = pid_nr_ns(rcu_dereference(task->pids[type].pid), ns); pid = rcu_dereference(task->group_leader->pids[type].pid);
nr = pid_nr_ns(pid, ns);
} }
rcu_read_unlock(); rcu_read_unlock();
......
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