mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 09:16:33 +00:00
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
|
else
|
||||||
memset(stats, 0, sizeof(*stats));
|
memset(stats, 0, sizeof(*stats));
|
||||||
|
|
||||||
tsk = first;
|
|
||||||
start_time = ktime_get_ns();
|
start_time = ktime_get_ns();
|
||||||
do {
|
for_each_thread(first, tsk) {
|
||||||
if (tsk->exit_state)
|
if (tsk->exit_state)
|
||||||
continue;
|
continue;
|
||||||
/*
|
/*
|
||||||
@ -258,7 +257,7 @@ static int fill_stats_for_tgid(pid_t tgid, struct taskstats *stats)
|
|||||||
|
|
||||||
stats->nvcsw += tsk->nvcsw;
|
stats->nvcsw += tsk->nvcsw;
|
||||||
stats->nivcsw += tsk->nivcsw;
|
stats->nivcsw += tsk->nivcsw;
|
||||||
} while_each_thread(first, tsk);
|
}
|
||||||
|
|
||||||
unlock_task_sighand(first, &flags);
|
unlock_task_sighand(first, &flags);
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user