diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2017-06-04 05:32:13 -0400 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2018-07-21 11:43:12 -0400 |
commit | 6883f81aac6f44e7df70a6af189b3689ff52cbfb (patch) | |
tree | 184e376d23aa5ea7321e22f23dd78a3c77c74a63 /kernel/fork.c | |
parent | 2c4704756cab7cfa031ada4dab361562f0e357c0 (diff) |
pid: Implement PIDTYPE_TGID
Everywhere except in the pid array we distinguish between a tasks pid and
a tasks tgid (thread group id). Even in the enumeration we want that
distinction sometimes so we have added __PIDTYPE_TGID. With leader_pid
we almost have an implementation of PIDTYPE_TGID in struct signal_struct.
Add PIDTYPE_TGID as a first class member of the pid_type enumeration and
into the pids array. Then remove the __PIDTYPE_TGID special case and the
leader_pid in signal_struct.
The net size increase is just an extra pointer added to struct pid and
an extra pair of pointers of an hlist_node added to task_struct.
The effect on code maintenance is the removal of a number of special
cases today and the potential to remove many more special cases as
PIDTYPE_TGID gets used to it's fullest. The long term potential
is allowing zombie thread group leaders to exit, which will remove
a lot more special cases in the code.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Diffstat (limited to 'kernel/fork.c')
-rw-r--r-- | kernel/fork.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index d2952162399b..cc5be0d01ce6 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -1946,6 +1946,7 @@ static __latent_entropy struct task_struct *copy_process( | |||
1946 | 1946 | ||
1947 | init_task_pid(p, PIDTYPE_PID, pid); | 1947 | init_task_pid(p, PIDTYPE_PID, pid); |
1948 | if (thread_group_leader(p)) { | 1948 | if (thread_group_leader(p)) { |
1949 | init_task_pid(p, PIDTYPE_TGID, pid); | ||
1949 | init_task_pid(p, PIDTYPE_PGID, task_pgrp(current)); | 1950 | init_task_pid(p, PIDTYPE_PGID, task_pgrp(current)); |
1950 | init_task_pid(p, PIDTYPE_SID, task_session(current)); | 1951 | init_task_pid(p, PIDTYPE_SID, task_session(current)); |
1951 | 1952 | ||
@@ -1954,7 +1955,6 @@ static __latent_entropy struct task_struct *copy_process( | |||
1954 | p->signal->flags |= SIGNAL_UNKILLABLE; | 1955 | p->signal->flags |= SIGNAL_UNKILLABLE; |
1955 | } | 1956 | } |
1956 | 1957 | ||
1957 | p->signal->leader_pid = pid; | ||
1958 | p->signal->tty = tty_kref_get(current->signal->tty); | 1958 | p->signal->tty = tty_kref_get(current->signal->tty); |
1959 | /* | 1959 | /* |
1960 | * Inherit has_child_subreaper flag under the same | 1960 | * Inherit has_child_subreaper flag under the same |
@@ -1965,6 +1965,7 @@ static __latent_entropy struct task_struct *copy_process( | |||
1965 | p->real_parent->signal->is_child_subreaper; | 1965 | p->real_parent->signal->is_child_subreaper; |
1966 | list_add_tail(&p->sibling, &p->real_parent->children); | 1966 | list_add_tail(&p->sibling, &p->real_parent->children); |
1967 | list_add_tail_rcu(&p->tasks, &init_task.tasks); | 1967 | list_add_tail_rcu(&p->tasks, &init_task.tasks); |
1968 | attach_pid(p, PIDTYPE_TGID); | ||
1968 | attach_pid(p, PIDTYPE_PGID); | 1969 | attach_pid(p, PIDTYPE_PGID); |
1969 | attach_pid(p, PIDTYPE_SID); | 1970 | attach_pid(p, PIDTYPE_SID); |
1970 | __this_cpu_inc(process_counts); | 1971 | __this_cpu_inc(process_counts); |