has_stopped_jobs: s/task_is_stopped/SIGNAL_STOP_STOPPED/
PATCH 1/1 has_stopped_jobs: s/task_is_stopped/SIGNAL_STOP_STOPPED/
has_stopped_jobs() naively checks task_is_stopped(group_leader). This was always wrong even without ptrace, group_leader can be dead. And given that ptrace can change the state to TRACED this is wrong even in the single-threaded case.
Change the code to check SIGNAL_STOP_STOPPED and simplify the code, retval + break/continue doesn't make this trivial code more readable.
We could probably add the usual "|| signal->group_stop_count" check but I don't think this makes sense, the task can start the group-stop right after the check anyway.
---
kernel/exit.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
kernel/exit.c renamed from kernel/exit.c~2_has_stopped_jobs +5 -7
@@ -266,18 +266,16 @@ int is_current_pgrp_orphaned(void)return retval; } -static int has_stopped_jobs (struct pid *pgrp) +static bool has_stopped_jobs (struct pid *pgrp) { -int retval =0 ;struct task_struct *p; do_each_pid_task(pgrp, PIDTYPE_PGID, p) { -if (!task_is_stopped (p)) -continue ; - retval =1 ; -break ; +if (p->signal->flags &SIGNAL_STOP_STOPPED ) +return true; }while_each_pid_task (pgrp,PIDTYPE_PGID , p); -return retval; + +return false; }/*
Quoted 5 lines · Oleg Nesterov
has_stopped_jobs()naively checkstask_is_stopped(group_leader). This was always wrong even without ptrace,group_leadercan be dead. And given that ptrace can change the state to TRACED this is wrong even in the single-threaded case.
Quoted 8 lines
Change the code to check
SIGNAL_STOP_STOPPEDand simplify the code, retval + break/continue doesn't make this trivial code more readable.We could probably add the usual "||
signal->group_stop_count" check but I don't think this makes sense, the task can start the group-stop right after the check anyway.Signed-off-by Oleg Nesterov <[email protected]>
As for "|| signal->group_stop_count", it might be better to use the same wrapper here too for consistency if we add one.
Thank you.
Signature · 1 line
tejun