hung_task: log summary line when warning budget is exhausted

Once the warning budget is exhausted, hung_task_info() normally stops
printing per-task details. When panic is triggered, full details are
still printed so diagnostics remain available before panic.

To retain visibility without restoring per-task output after budget
exhaustion, emit a single aggregate summary line at the end of each
watchdog scan that detects hung tasks with an exhausted budget. This
keeps non-panic per-task reports budgeted during system-wide hangs.

Link: https://lore.kernel.org/20261004163610.413506-3-atomlin@atomlin.com
Signed-off-by: Aaron Tomlin <atomlin@atomlin.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Suggested-by: Petr Mladek <pmladek@suse.com>
Suggested-by: Lance Yang <lance.yang@linux.dev>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Reviewed-by: Lance Yang <lance.yang@linux.dev>
Reviewed-by: Bradley Morgan <brads@mainlining.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: David Laight <david.laight.linux@gmail.com>
Cc: Daniel Vacek <neelx@suse.com>
Cc: Sean Ashe <sean@ashe.io>
Cc: <chjohnst@gmail.com>
Cc: <steve@abita.co>
Cc: <mproche@gmail.com>
Cc: <nick.lange@gmail.com>
This commit is contained in:
Aaron Tomlin 2026-10-04 12:36:10 -04:00 committed by Andrew Morton
parent e614d360f3
commit 36dd57d0ae

View File

@ -276,8 +276,8 @@ static void hung_task_info(struct task_struct *t, unsigned long timeout,
sched_show_task(t);
debug_show_blocker(t, timeout);
if (!hung_task_warnings_budget)
pr_info("Future hung task reports are suppressed, see sysctl kernel.hung_task_warnings\n");
if (!hung_task_warnings_budget && !hung_task_call_panic)
pr_info("hung_task: further per-task details suppressed until warning budget is reset (see sysctl kernel.hung_task_warnings)\n");
}
touch_nmi_watchdog();
@ -363,6 +363,10 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)
return;
}
if (!hung_task_warnings_budget && !hung_task_call_panic)
pr_info("hung_task: %lu hung tasks detected, warning budget exhausted\n",
this_round_count);
if (need_warning || hung_task_call_panic) {
si_mask |= SYS_INFO_LOCKS;