Commit 570f5241 authored by Sergey Senozhatsky's avatar Sergey Senozhatsky Committed by Ingo Molnar

sched/core: Check tgid in is_global_init()

Our global init task can have sub-threads, so ->pid check is not reliable
enough for is_global_init(), we need to check tgid instead. This has been
spotted by Oleg and a fix was proposed by Richard a long time ago (see the
link below).

Oleg wrote:

  : Because is_global_init() is only true for the main thread of /sbin/init.
  :
  : Just look at oom_unkillable_task(). It tries to not kill init. But, say,
  : select_bad_process() can happily find a sub-thread of is_global_init()
  : and still kill it.

I recently hit the problem in question; re-sending the patch (to the
best of my knowledge it has never been submitted) with updated function
comment. Credit goes to Oleg and Richard.
Suggested-by: default avatarRichard Guy Briggs <rgb@redhat.com>
Reported-by: default avatarOleg Nesterov <oleg@redhat.com>
Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: default avatarSerge Hallyn <serge.hallyn@canonical.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Eric W . Biederman <ebiederm@xmission.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Serge E . Hallyn <serge.hallyn@ubuntu.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: https://www.redhat.com/archives/linux-audit/2013-December/msg00086.htmlSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 9e0e83a1
...@@ -2002,7 +2002,8 @@ static inline int pid_alive(const struct task_struct *p) ...@@ -2002,7 +2002,8 @@ static inline int pid_alive(const struct task_struct *p)
} }
/** /**
* is_global_init - check if a task structure is init * is_global_init - check if a task structure is init. Since init
* is free to have sub-threads we need to check tgid.
* @tsk: Task structure to be checked. * @tsk: Task structure to be checked.
* *
* Check if a task structure is the first user space task the kernel created. * Check if a task structure is the first user space task the kernel created.
...@@ -2011,7 +2012,7 @@ static inline int pid_alive(const struct task_struct *p) ...@@ -2011,7 +2012,7 @@ static inline int pid_alive(const struct task_struct *p)
*/ */
static inline int is_global_init(struct task_struct *tsk) static inline int is_global_init(struct task_struct *tsk)
{ {
return tsk->pid == 1; return task_tgid_nr(tsk) == 1;
} }
extern struct pid *cad_pid; extern struct pid *cad_pid;
......
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