|
@@ -265,27 +265,35 @@ struct pid *find_vpid(int nr)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(find_vpid);
|
|
|
|
|
|
+static struct pid **task_pid_ptr(struct task_struct *task, enum pid_type type)
|
|
|
+{
|
|
|
+ return (type == PIDTYPE_PID) ?
|
|
|
+ &task->thread_pid :
|
|
|
+ (type == __PIDTYPE_TGID) ?
|
|
|
+ &task->signal->leader_pid :
|
|
|
+ &task->signal->pids[type];
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* attach_pid() must be called with the tasklist_lock write-held.
|
|
|
*/
|
|
|
void attach_pid(struct task_struct *task, enum pid_type type)
|
|
|
{
|
|
|
- struct pid_link *link = &task->pids[type];
|
|
|
- hlist_add_head_rcu(&link->node, &link->pid->tasks[type]);
|
|
|
+ struct pid *pid = *task_pid_ptr(task, type);
|
|
|
+ hlist_add_head_rcu(&task->pid_links[type], &pid->tasks[type]);
|
|
|
}
|
|
|
|
|
|
static void __change_pid(struct task_struct *task, enum pid_type type,
|
|
|
struct pid *new)
|
|
|
{
|
|
|
- struct pid_link *link;
|
|
|
+ struct pid **pid_ptr = task_pid_ptr(task, type);
|
|
|
struct pid *pid;
|
|
|
int tmp;
|
|
|
|
|
|
- link = &task->pids[type];
|
|
|
- pid = link->pid;
|
|
|
+ pid = *pid_ptr;
|
|
|
|
|
|
- hlist_del_rcu(&link->node);
|
|
|
- link->pid = new;
|
|
|
+ hlist_del_rcu(&task->pid_links[type]);
|
|
|
+ *pid_ptr = new;
|
|
|
|
|
|
for (tmp = PIDTYPE_MAX; --tmp >= 0; )
|
|
|
if (!hlist_empty(&pid->tasks[tmp]))
|
|
@@ -310,8 +318,9 @@ void change_pid(struct task_struct *task, enum pid_type type,
|
|
|
void transfer_pid(struct task_struct *old, struct task_struct *new,
|
|
|
enum pid_type type)
|
|
|
{
|
|
|
- new->pids[type].pid = old->pids[type].pid;
|
|
|
- hlist_replace_rcu(&old->pids[type].node, &new->pids[type].node);
|
|
|
+ if (type == PIDTYPE_PID)
|
|
|
+ new->thread_pid = old->thread_pid;
|
|
|
+ hlist_replace_rcu(&old->pid_links[type], &new->pid_links[type]);
|
|
|
}
|
|
|
|
|
|
struct task_struct *pid_task(struct pid *pid, enum pid_type type)
|
|
@@ -322,7 +331,7 @@ struct task_struct *pid_task(struct pid *pid, enum pid_type type)
|
|
|
first = rcu_dereference_check(hlist_first_rcu(&pid->tasks[type]),
|
|
|
lockdep_tasklist_lock_is_held());
|
|
|
if (first)
|
|
|
- result = hlist_entry(first, struct task_struct, pids[(type)].node);
|
|
|
+ result = hlist_entry(first, struct task_struct, pid_links[(type)]);
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
@@ -360,9 +369,7 @@ struct pid *get_task_pid(struct task_struct *task, enum pid_type type)
|
|
|
{
|
|
|
struct pid *pid;
|
|
|
rcu_read_lock();
|
|
|
- if (type != PIDTYPE_PID)
|
|
|
- task = task->group_leader;
|
|
|
- pid = get_pid(rcu_dereference(task->pids[type].pid));
|
|
|
+ pid = get_pid(rcu_dereference(*task_pid_ptr(task, type)));
|
|
|
rcu_read_unlock();
|
|
|
return pid;
|
|
|
}
|
|
@@ -420,16 +427,8 @@ pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type,
|
|
|
rcu_read_lock();
|
|
|
if (!ns)
|
|
|
ns = task_active_pid_ns(current);
|
|
|
- if (likely(pid_alive(task))) {
|
|
|
- struct pid *pid;
|
|
|
- if (type == PIDTYPE_PID)
|
|
|
- pid = task_pid(task);
|
|
|
- else if (type == __PIDTYPE_TGID)
|
|
|
- pid = task_tgid(task);
|
|
|
- else
|
|
|
- pid = rcu_dereference(task->group_leader->pids[type].pid);
|
|
|
- nr = pid_nr_ns(pid, ns);
|
|
|
- }
|
|
|
+ if (likely(pid_alive(task)))
|
|
|
+ nr = pid_nr_ns(rcu_dereference(*task_pid_ptr(task, type)), ns);
|
|
|
rcu_read_unlock();
|
|
|
|
|
|
return nr;
|