summaryrefslogtreecommitdiffstats
path: root/kernel/fork.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2017-06-04 05:32:13 -0400
committerEric W. Biederman <ebiederm@xmission.com>2018-07-21 11:43:12 -0400
commit6883f81aac6f44e7df70a6af189b3689ff52cbfb (patch)
tree184e376d23aa5ea7321e22f23dd78a3c77c74a63 /kernel/fork.c
parent2c4704756cab7cfa031ada4dab361562f0e357c0 (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.c3
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);