diff options
author | Oleg Nesterov <oleg@redhat.com> | 2014-12-10 18:45:21 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-12-10 20:41:09 -0500 |
commit | a90e984c8a660dd58894a68cc5d9d5cd457d5796 (patch) | |
tree | d6426e282d133edbf4cded526bd8f9f882d59cae /kernel/sched/core.c | |
parent | abdba6e9ea6d3903c2b0618db720e17b3c1c705c (diff) |
sched_show_task: fix unsafe usage of ->real_parent
rcu_read_lock() can not protect p->real_parent if release_task(p) was
already called, change sched_show_task() to check pis_alive() like other
users do.
Note: we need some helpers to cleanup the code like this. And it seems
that that the usage of cpu_curr(cpu) in dump_cpu_task() is not safe too.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Cc: Aaron Tomlin <atomlin@redhat.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>,
Cc: Sterling Alexander <stalexan@redhat.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Roland McGrath <roland@hack.frob.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/sched/core.c')
-rw-r--r-- | kernel/sched/core.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index bb398c0c5f08..b5797b78add6 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -4527,8 +4527,10 @@ void sched_show_task(struct task_struct *p) | |||
4527 | #ifdef CONFIG_DEBUG_STACK_USAGE | 4527 | #ifdef CONFIG_DEBUG_STACK_USAGE |
4528 | free = stack_not_used(p); | 4528 | free = stack_not_used(p); |
4529 | #endif | 4529 | #endif |
4530 | ppid = 0; | ||
4530 | rcu_read_lock(); | 4531 | rcu_read_lock(); |
4531 | ppid = task_pid_nr(rcu_dereference(p->real_parent)); | 4532 | if (pid_alive(p)) |
4533 | ppid = task_pid_nr(rcu_dereference(p->real_parent)); | ||
4532 | rcu_read_unlock(); | 4534 | rcu_read_unlock(); |
4533 | printk(KERN_CONT "%5lu %5d %6d 0x%08lx\n", free, | 4535 | printk(KERN_CONT "%5lu %5d %6d 0x%08lx\n", free, |
4534 | task_pid_nr(p), ppid, | 4536 | task_pid_nr(p), ppid, |