Re: [PATCH v2] sched: print parent comm in sched_show_task()

From: Petr Mladek
Date: Fri Jan 20 2023 - 08:09:41 EST


On Thu 2023-01-19 19:06:42, Tio Zhang wrote:
> Knowing who the parent is might be useful for debugging.
> For example, we can sometimes resolve kernel hung tasks by stopping
> the person who begins those hung tasks.
> With the parent's name printed in sched_show_task(),
> it might be helpful to let people know which "service" should be operated.
> Also, we move the parent info to a following new line while keeping the
> original line the same.
> And we would print "parent:unknown ppid:<NULL>"
> when the task is not alive.
>
> Signed-off-by: Tio Zhang <tiozhang@xxxxxxxxxxxxxx>
> ---
> kernel/sched/core.c | 14 ++++++++++++--
> 1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index cb2aa2b54c7a..5690a5700f9e 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -8854,6 +8854,7 @@ void sched_show_task(struct task_struct *p)
> {
> unsigned long free = 0;
> int ppid;
> + char *pcomm = NULL;
>
> if (!try_get_task_stack(p))
> return;
> @@ -8867,13 +8868,22 @@ void sched_show_task(struct task_struct *p)
> #endif
> ppid = 0;
> rcu_read_lock();
> - if (pid_alive(p))
> - ppid = task_pid_nr(rcu_dereference(p->real_parent));
> + if (pid_alive(p)) {
> + struct task_struct *parent = rcu_dereference(p->real_parent);
> +
> + ppid = task_pid_nr(parent);
> + pcomm = parent->comm;
> + }
> rcu_read_unlock();
> pr_cont(" stack:%-5lu pid:%-5d ppid:%-6d flags:0x%08lx\n",
> free, task_pid_nr(p), ppid,

This prints "ppid:0" when pid_alive() returns false.

> read_task_thread_flags(p));
>
> + if (!ppid)
> + pr_info("parent:unknown ppid:<NULL>\n");

This prints "ppid:<NULL>". The inconsistency is weird.

Also there is no need to print ppid twice. I would remove it
from the " stack:..." line as it was done in the previous version
of the patch.

> + else

> + pr_info("parent:%-15.15s ppid:%-6d\n", pcomm, ppid);

"pcomm" must not be accessed after rcu_read_unlock(). The parent might
disappear in the meantime.

I suggest to got back to the previous version and just add printing
"parent:unknown ppid:<NULL>\n" when pid_alive(p) fails.

Best Regards,
Petr