taskstats: fill_stats_for_tgid: use for_each_thread()
do/while_each_thread should be avoided when possible. Plus I _think_ this change allows to avoid lock_task_sighand() but I am not sure, I forgot everything about taskstats. In any case, this code does not look right in that the same thread can be accounted twice: taskstats_exit() can account the exiting thread in signal->stats and drop ->siglock but this thread is still on the thread-group list, so lock_task_sighand() can't help. Link: https://lkml.kernel.org/r/20230909214951.GA24274@redhat.com Signed-off-by: Oleg Nesterov <oleg@redhat.com> Cc: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
13b7bc60b5
commit
ed5378a387
|
@ -233,9 +233,8 @@ static int fill_stats_for_tgid(pid_t tgid, struct taskstats *stats)
|
|||
else
|
||||
memset(stats, 0, sizeof(*stats));
|
||||
|
||||
tsk = first;
|
||||
start_time = ktime_get_ns();
|
||||
do {
|
||||
for_each_thread(first, tsk) {
|
||||
if (tsk->exit_state)
|
||||
continue;
|
||||
/*
|
||||
|
@ -258,7 +257,7 @@ static int fill_stats_for_tgid(pid_t tgid, struct taskstats *stats)
|
|||
|
||||
stats->nvcsw += tsk->nvcsw;
|
||||
stats->nivcsw += tsk->nivcsw;
|
||||
} while_each_thread(first, tsk);
|
||||
}
|
||||
|
||||
unlock_task_sighand(first, &flags);
|
||||
rc = 0;
|
||||
|
|
Loading…
Reference in New Issue