From: Balbir Singh <balbirs@nvidia.com>
To: Yiyang Chen <cyyzero16@gmail.com>,
Yang Yang <yang.yang29@zte.com.cn>,
Wang Yaxin <wang.yaxin@zte.com.cn>
Cc: linux-kernel@vger.kernel.org, Oleg Nesterov <oleg@redhat.com>,
"Dr . Thomas Orgis" <thomas.orgis@uni-hamburg.de>,
Andrew Morton <akpm@linux-foundation.org>,
stable@vger.kernel.org
Subject: Re: [PATCH v2 1/2] taskstats: retain dead thread stats in TGID queries
Date: Mon, 13 Apr 2026 13:00:28 +1000 [thread overview]
Message-ID: <d530ffd7-ebfa-46e1-afd3-2599a3ffaa55@nvidia.com> (raw)
In-Reply-To: <99c79e8529eb2c125ffd1eaa9f5d6b479fec227c.1776020234.git.cyyzero16@gmail.com>
On 4/13/26 05:18, Yiyang Chen wrote:
> fill_stats_for_tgid() builds TGID stats from two sources: the cached
> aggregate in signal->stats and a scan of the live threads in the group.
>
> However, fill_tgid_exit() only accumulates delay accounting into
> signal->stats. This means that once a thread exits, TGID queries lose
> the fields that fill_stats_for_tgid() adds for live threads.
>
> This gap was introduced incrementally by two earlier changes that
> extended fill_stats_for_tgid() but did not make the corresponding
> update to fill_tgid_exit():
>
> - commit 8c733420bdd5 ("taskstats: add e/u/stime for TGID command")
> added ac_etime, ac_utime, and ac_stime to the TGID query path.
> - commit b663a79c1915 ("taskstats: add context-switch counters")
> added nvcsw and nivcsw to the TGID query path.
>
> As a result, those fields were accounted for live threads in TGID
> queries, but were dropped from the cached TGID aggregate after thread
> exit. The final TGID exit notification emitted when group_dead is true
> also copies that cached aggregate, so it loses the same fields.
>
> Factor the per-task TGID accumulation into tgid_stats_add_task() and
> use it in both fill_stats_for_tgid() and fill_tgid_exit(). This keeps
> the cached aggregate used for dead threads aligned with the live-thread
> accumulation used by TGID queries.
>
> Fixes: 8c733420bdd5 ("taskstats: add e/u/stime for TGID command")
> Fixes: b663a79c1915 ("taskstats: add context-switch counters")
> Cc: stable@vger.kernel.org
> Signed-off-by: Yiyang Chen <cyyzero16@gmail.com>
>
> diff --git a/kernel/taskstats.c b/kernel/taskstats.c
> index 0cd680ccc7e5..a80be5d9f52b 100644
> --- a/kernel/taskstats.c
> +++ b/kernel/taskstats.c
> @@ -210,13 +210,39 @@ static int fill_stats_for_pid(pid_t pid, struct taskstats *stats)
> return 0;
> }
>
> +static void tgid_stats_add_task(struct taskstats *stats,
> + struct task_struct *tsk, u64 now_ns)
> +{
> + u64 delta, utime, stime;
> +
> + /*
> + * Each accounting subsystem calls its functions here to
> + * accumulate its per-task stats for tsk, into the per-tgid structure
> + *
> + * per-task-foo(tsk->signal->stats, tsk);
> + */
The comment should read per-task-foo(stats, tsk);
> + delayacct_add_tsk(stats, tsk);
> +
> + /* calculate task elapsed time in nsec */
> + delta = now_ns - tsk->start_time;
> + /* Convert to micro seconds */
> + do_div(delta, NSEC_PER_USEC);
> + stats->ac_etime += delta;
> +
> + task_cputime(tsk, &utime, &stime);
> + stats->ac_utime += div_u64(utime, NSEC_PER_USEC);
> + stats->ac_stime += div_u64(stime, NSEC_PER_USEC);
> +
> + stats->nvcsw += tsk->nvcsw;
> + stats->nivcsw += tsk->nivcsw;
> +}
> +
> static int fill_stats_for_tgid(pid_t tgid, struct taskstats *stats)
> {
> struct task_struct *tsk, *first;
> unsigned long flags;
> int rc = -ESRCH;
> - u64 delta, utime, stime;
> - u64 start_time;
> + u64 now_ns;
>
> /*
> * Add additional stats from live tasks except zombie thread group
> @@ -233,30 +259,12 @@ static int fill_stats_for_tgid(pid_t tgid, struct taskstats *stats)
> else
> memset(stats, 0, sizeof(*stats));
>
> - start_time = ktime_get_ns();
> + now_ns = ktime_get_ns();
> for_each_thread(first, tsk) {
> if (tsk->exit_state)
> continue;
> - /*
> - * Accounting subsystem can call its functions here to
> - * fill in relevant parts of struct taskstsats as follows
> - *
> - * per-task-foo(stats, tsk);
> - */
> - delayacct_add_tsk(stats, tsk);
> -
> - /* calculate task elapsed time in nsec */
> - delta = start_time - tsk->start_time;
> - /* Convert to micro seconds */
> - do_div(delta, NSEC_PER_USEC);
> - stats->ac_etime += delta;
>
> - task_cputime(tsk, &utime, &stime);
> - stats->ac_utime += div_u64(utime, NSEC_PER_USEC);
> - stats->ac_stime += div_u64(stime, NSEC_PER_USEC);
> -
> - stats->nvcsw += tsk->nvcsw;
> - stats->nivcsw += tsk->nivcsw;
> + tgid_stats_add_task(stats, tsk, now_ns);
> }
>
> unlock_task_sighand(first, &flags);
> @@ -275,18 +283,14 @@ static int fill_stats_for_tgid(pid_t tgid, struct taskstats *stats)
> static void fill_tgid_exit(struct task_struct *tsk)
> {
> unsigned long flags;
> + u64 now_ns;
>
> spin_lock_irqsave(&tsk->sighand->siglock, flags);
> if (!tsk->signal->stats)
> goto ret;
>
> - /*
> - * Each accounting subsystem calls its functions here to
> - * accumalate its per-task stats for tsk, into the per-tgid structure
> - *
> - * per-task-foo(tsk->signal->stats, tsk);
> - */
> - delayacct_add_tsk(tsk->signal->stats, tsk);
> + now_ns = ktime_get_ns();
> + tgid_stats_add_task(tsk->signal->stats, tsk, now_ns);
> ret:
> spin_unlock_irqrestore(&tsk->sighand->siglock, flags);
> return;
Acked-by: Balbir Singh <balbirs@nvidia.com>
next prev parent reply other threads:[~2026-04-13 3:00 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-12 19:18 [PATCH v2 0/2] taskstats: fix TGID dead-thread stat retention Yiyang Chen
2026-04-12 19:18 ` [PATCH v2 1/2] taskstats: retain dead thread stats in TGID queries Yiyang Chen
2026-04-13 3:00 ` Balbir Singh [this message]
2026-04-12 19:18 ` [PATCH v2 2/2] selftests/acct: add taskstats TGID retention test Yiyang Chen
2026-04-13 3:04 ` Balbir Singh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d530ffd7-ebfa-46e1-afd3-2599a3ffaa55@nvidia.com \
--to=balbirs@nvidia.com \
--cc=akpm@linux-foundation.org \
--cc=cyyzero16@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=stable@vger.kernel.org \
--cc=thomas.orgis@uni-hamburg.de \
--cc=wang.yaxin@zte.com.cn \
--cc=yang.yang29@zte.com.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox