From nobody Thu Apr 2 18:46:24 2026 Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0D8072D73B5 for ; Thu, 26 Mar 2026 19:12:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774552337; cv=none; b=lkoqrx9wX5Nnm6shRaf0AjlmHaMjmNvLEQzIpCkiDaVnB0hckzJpk8sbzO/uEFLuisp2PtKz2NO+TUJBVZsAYEb6UvnW5v2PJA3SdPs4ct3Bpn+AyBNNLg547Xw7w3NQu0sMinR6f60dsQ8wg132eEtNpM0dU/vQ0Ze+njBx8Ro= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774552337; c=relaxed/simple; bh=E57LPPoGR6nkg5Azo6vcscTYUQ2LXcEJ2K2wq7SnBd4=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=OQ5LIA4QhZR7USs/+ncVYuQb01Ir36R2RqopRNNy7AReoq+Z1PewpX6XOgJNx2t0Bdby32BVeF2tJVTUYXyCvylbh/kybUHDaVaf/EY6YbKNGxqqsxLVmIKiiUXSmTKaNxumoJ5gXf9UZT7YJqg+FrwiolF0rdY8oeBQAOX4vv4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=pgdiTvY/; arc=none smtp.client-ip=209.85.216.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="pgdiTvY/" Received: by mail-pj1-f48.google.com with SMTP id 98e67ed59e1d1-35bb9070644so839269a91.2 for ; Thu, 26 Mar 2026 12:12:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774552335; x=1775157135; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=Brt6cldeajjXS8DIaeiTx4Gpja5Zyg7MMZZKL2twgSM=; b=pgdiTvY/tUmTerP4pVU2UM+IoH4LpKuWVDWwtFtenM66dPT8oUaoG7vJ2VoP3YZ454 iBmK3Gzcd74mo1dH8Yq7bVkCD8Zmda29A2kasvVC/9IyCarpM8MA3QkJ0+1leJZTFuEk ghhnx8Zujhwg97bb2URQMdsoBHnUCbzOV1nCsm9ZbvKJzcpGlV0OBcbp4cduTb0AIXMd AEPFS2Ih2yZgo2I5kZSEvlnPbjtcb5IFARa7OVNWBckdftQMCcfABUJkLUOmUk/iFVgg qufwyTkGUdrAydNty3TUQKWpGDYhaxU41IifTJd/zT2FoOqQdbmoPqJaU1h1LL3e+K1m NHhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774552335; x=1775157135; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Brt6cldeajjXS8DIaeiTx4Gpja5Zyg7MMZZKL2twgSM=; b=cokNo25VbESzBwpkxnP6lGL9Xd6jdoqIq18VSS/mNT/GyiSE5t+0wkfQLLyJE5ollv XVRcsNGCbV3sCGBXe3YjHltmDv8a4nECQGxA4H/XXxx3YBEDLvuS09ZML5IvXmJqMgS8 DgiWVjYM9XweUGaZl6XcQnE4dceZK/Sdx+OcRuOWRLhY1ugPtePXe58+5ClAAxXbR8fj HxR5Ixohbq/psAUgLiXmpD4C6EkihY37li71YnuMD3SXGCydkfJvxD6nSCKwTgVyGS0H ghSq0nzLso0XhjCazo05+IotZR80CyIRVoBU9HU96icddROfXNnpGcCwsJOeBc5jZh1n rqGg== X-Gm-Message-State: AOJu0Yz8Etax1WR11Zva5Z8NdaBo3xQ01EI/sRY3Sc2YwNmhgebRX6QT 2cgJ7fl/11pL5Jjyw+BKP2gQg0zaDsZpsVc4UTItLRHcOHXZ00Mr4twI X-Gm-Gg: ATEYQzxGnebSrMoCjbwAeYbeJg/Udf87sbfz4EopSJhZT3R39jkAfQ3jSZK/9S57gYN fErkKGAA0AgNbBGpDVGPzwye2r0y+RWrai2MKUnSwFPQQ4UqpyXksYBoWUMDvUZ6oiZnE1wonvC 0jSpNLeB5uTapQ/QMp66+jiKy0skRuMY8gVJqmpheFdT0JDfQc/u7zQS5ABhqrGFgXsbNDUdXXa 0cGnFJxnWG+U5pQGLdTnrZJSH18tUnKasOHEcHr2v+Hp/XcOcmkURjqbvchAJzrZR18qCqwZFfP nVg16GunxQNxaCoow1xJG6gFLYLBi7dzXV9RnO2my8l1PN/Yp5ZMXOuveOtgNvh1UWIZn5AeNVa NseobNlZ1qxC8itrWxsoxQnB5U/DXxttWukBCqZ8Xnro1zy1ZBGdl8PsJFhYHi/lbXQh36Faf1f M/WQlTqGF9hFm2hWymBEfBKfY= X-Received: by 2002:a17:90a:e7d2:b0:359:96f7:a016 with SMTP id 98e67ed59e1d1-35c0ddc1a19mr7638443a91.33.1774552335440; Thu, 26 Mar 2026 12:12:15 -0700 (PDT) Received: from ubuntu24.lan ([14.219.61.122]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35c2d7aa949sm115094a91.0.2026.03.26.12.12.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 12:12:14 -0700 (PDT) From: Yiyang Chen To: Balbir Singh , Yang Yang , Wang Yaxin Cc: linux-kernel@vger.kernel.org, Oleg Nesterov , "Dr . Thomas Orgis" , Andrew Morton , Yiyang Chen Subject: [PATCH] taskstats: retain dead thread stats in TGID queries Date: Fri, 27 Mar 2026 03:12:07 +0800 Message-ID: <6f4ed79d96c389a9a1d67d5ced96c6326eda82ae.1774552296.git.cyyzero16@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 TGID queries lose the fields that fill_stats_for_tgid() adds for live threads once a thread exits, including ac_etime, ac_utime, ac_stime, nvcsw and nivcsw. Factor the per-task TGID accumulation into a helper and use it in both fill_stats_for_tgid() and fill_tgid_exit(). This keeps the fields retained for dead threads aligned with the fields already accounted for live threads, and follows the existing taskstats TGID aggregation model, which already accumulates delay accounting in fill_tgid_exit() and combines it with a live-thread scan in fill_stats_for_tgid(). Signed-off-by: Yiyang Chen --- kernel/taskstats.c | 62 ++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/kernel/taskstats.c b/kernel/taskstats.c index 0cd680ccc7e5..2a0ab42e4edd 100644 --- a/kernel/taskstats.c +++ b/kernel/taskstats.c @@ -210,13 +210,39 @@ static int fill_stats_for_pid(pid_t pid, struct tasks= tats *stats) return 0; } =20 +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); + */ + delayacct_add_tsk(stats, tsk); + + /* calculate task elapsed time in nsec */ + delta =3D now_ns - tsk->start_time; + /* Convert to micro seconds */ + do_div(delta, NSEC_PER_USEC); + stats->ac_etime +=3D delta; + + task_cputime(tsk, &utime, &stime); + stats->ac_utime +=3D div_u64(utime, NSEC_PER_USEC); + stats->ac_stime +=3D div_u64(stime, NSEC_PER_USEC); + + stats->nvcsw +=3D tsk->nvcsw; + stats->nivcsw +=3D tsk->nivcsw; +} + static int fill_stats_for_tgid(pid_t tgid, struct taskstats *stats) { struct task_struct *tsk, *first; unsigned long flags; int rc =3D -ESRCH; - u64 delta, utime, stime; - u64 start_time; + u64 now_ns; =20 /* * Add additional stats from live tasks except zombie thread group @@ -233,30 +259,12 @@ static int fill_stats_for_tgid(pid_t tgid, struct tas= kstats *stats) else memset(stats, 0, sizeof(*stats)); =20 - start_time =3D ktime_get_ns(); + now_ns =3D 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 =3D start_time - tsk->start_time; - /* Convert to micro seconds */ - do_div(delta, NSEC_PER_USEC); - stats->ac_etime +=3D delta; =20 - task_cputime(tsk, &utime, &stime); - stats->ac_utime +=3D div_u64(utime, NSEC_PER_USEC); - stats->ac_stime +=3D div_u64(stime, NSEC_PER_USEC); - - stats->nvcsw +=3D tsk->nvcsw; - stats->nivcsw +=3D tsk->nivcsw; + tgid_stats_add_task(stats, tsk, now_ns); } =20 unlock_task_sighand(first, &flags); @@ -275,18 +283,14 @@ static int fill_stats_for_tgid(pid_t tgid, struct tas= kstats *stats) static void fill_tgid_exit(struct task_struct *tsk) { unsigned long flags; + u64 now_ns; =20 spin_lock_irqsave(&tsk->sighand->siglock, flags); if (!tsk->signal->stats) goto ret; =20 - /* - * 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 =3D ktime_get_ns(); + tgid_stats_add_task(tsk->signal->stats, tsk, now_ns); ret: spin_unlock_irqrestore(&tsk->sighand->siglock, flags); return; --=20 2.43.0