pids: Compute task_tgid using signal->leader_pid
authorEric W. Biederman <ebiederm@xmission.com>
Tue, 26 Sep 2017 17:45:33 +0000 (12:45 -0500)
committerEric W. Biederman <ebiederm@xmission.com>
Sat, 21 Jul 2018 15:43:12 +0000 (10:43 -0500)
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: "Eric W. Biederman" <ebiederm@xmission.com>
arch/ia64/kernel/asm-offsets.c
arch/ia64/kernel/fsys.S
drivers/platform/x86/thinkpad_acpi.c
fs/fuse/file.c
fs/notify/fanotify/fanotify.c
include/linux/sched.h
include/linux/sched/signal.h
include/net/scm.h
kernel/pid.c

index f4db216..f5433bb 100644 (file)
@@ -50,7 +50,6 @@ void foo(void)
 
        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_GROUP_LEADER_OFFSET, offsetof (struct task_struct, group_leader));
        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_UPID_OFFSET, offsetof (struct pid, numbers[0]));
@@ -68,6 +67,7 @@ void foo(void)
        DEFINE(IA64_SIGNAL_GROUP_STOP_COUNT_OFFSET,offsetof (struct signal_struct,
                                                             group_stop_count));
        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();
 
index fe742ff..eaf5a0d 100644 (file)
@@ -62,16 +62,16 @@ ENTRY(fsys_getpid)
        .prologue
        .altrp b6
        .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
        ;;
        ld4 r9=[r9]
-       add r17=IA64_TASK_TGIDLINK_OFFSET,r17
+       add r17=IA64_SIGNAL_LEADER_PID_OFFSET,r17
        ;;
        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
        ;;
index cae9b05..d556e95 100644 (file)
@@ -57,6 +57,7 @@
 #include <linux/list.h>
 #include <linux/mutex.h>
 #include <linux/sched.h>
+#include <linux/sched/signal.h>
 #include <linux/kthread.h>
 #include <linux/freezer.h>
 #include <linux/delay.h>
index a201fb0..b00a3f1 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/slab.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/sched/signal.h>
 #include <linux/module.h>
 #include <linux/compat.h>
 #include <linux/swap.h>
index f90842e..6e828cb 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/mount.h>
 #include <linux/sched.h>
 #include <linux/sched/user.h>
+#include <linux/sched/signal.h>
 #include <linux/types.h>
 #include <linux/wait.h>
 #include <linux/audit.h>
index 87bf02d..a461ff8 100644 (file)
@@ -1202,11 +1202,6 @@ static inline struct pid *task_pid(struct task_struct *task)
        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
  * the result of task_pgrp/task_session even if task == current,
index d8ef0a3..b95a272 100644 (file)
@@ -564,6 +564,11 @@ struct pid *task_pid_type(struct task_struct *task, enum pid_type type)
        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)
 {
        return tsk->signal->nr_threads;
index 903771c..1ce365f 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/security.h>
 #include <linux/pid.h>
 #include <linux/nsproxy.h>
+#include <linux/sched/signal.h>
 
 /* Well, we should have at least one descriptor open
  * to accept passed FDs 8)
index 157fe4b..d0de2b5 100644 (file)
@@ -421,13 +421,14 @@ pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type,
        if (!ns)
                ns = task_active_pid_ns(current);
        if (likely(pid_alive(task))) {
-               if (type != PIDTYPE_PID) {
-                       if (type == __PIDTYPE_TGID)
-                               type = PIDTYPE_PID;
-
-                       task = task->group_leader;
-               }
-               nr = pid_nr_ns(rcu_dereference(task->pids[type].pid), ns);
+               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);
        }
        rcu_read_unlock();