Re: [PATCH v2 2/4] hung_task: Add hung_task_sys_info sysctl to dump sys info on task-hung
From: Feng Tang
Date: Sun Nov 16 2025 - 09:14:10 EST
On Sun, Nov 16, 2025 at 09:22:43PM +0800, Lance Yang wrote:
> > > Looking at the history:
> > >
> > > 1) Commit ("hung_task: ignore hung_task_warnings when hung_task_panic
> > > is enabled")[1] ensured that hung task information is always dumped
> > > when a panic is configured, even if the warning counter is exhausted.
> > >
> > > 2) Later, commit ("hung_task: panic when there are more than N hung
> > > tasks at the same time")[2] refined the logic to trigger a panic based
> > > on the number of hung tasks found in a single scan.
> > >
> > > To stay consistent with the established behavior, I think we should
> > > continue to dump the information for hung tasks as long as
> > > sysctl_hung_task_panic is enabled :)
> > >
> > > [1] https://lore.kernel.org/all/20240613033159.3446265-1-leonylgao@xxxxxxxxx
> > > [2] https://lore.kernel.org/all/20251015063615.2632-1-lirongqing@xxxxxxxxx
> > > [...]
> >
> > Aha, Petr asked similar question during his review. Thanks for the catch!
> >
> > How about following fixup patch to restore that part of logic?
> >
> > Thanks,
> > Feng
> >
> > ---
> > diff --git a/kernel/hung_task.c b/kernel/hung_task.c
> > index 5b3a7785d3a2..d2254c91450b 100644
> > --- a/kernel/hung_task.c
> > +++ b/kernel/hung_task.c
> > @@ -223,8 +223,11 @@ static inline void debug_show_blocker(struct task_struct *task, unsigned long ti
> > }
> > #endif
> > -static void check_hung_task(struct task_struct *t, unsigned long timeout)
> > +static void check_hung_task(struct task_struct *t, unsigned long timeout,
> > + unsigned long prev_detect_count)
> > {
> > + unsigned long total_hung_task;
> > +
> > if (!task_is_hung(t, timeout))
> > return;
> > @@ -234,13 +237,19 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout)
> > */
> > sysctl_hung_task_detect_count++;
> > + total_hung_task = sysctl_hung_task_detect_count - prev_detect_count;
> > trace_sched_process_hang(t);
> > + if (sysctl_hung_task_panic && total_hung_task >= sysctl_hung_task_panic) {
> > + console_verbose();
> > + hung_task_call_panic = true;
> > + }
> > +
> > /*
> > * Ok, the task did not get scheduled for more than 2 minutes,
> > * complain:
> > */
> > - if (sysctl_hung_task_warnings) {
> > + if (sysctl_hung_task_warnings || hung_task_call_panic) {
> > if (sysctl_hung_task_warnings > 0)
> > sysctl_hung_task_warnings--;
> > pr_err("INFO: task %s:%d blocked for more than %ld seconds.\n",
> > @@ -295,7 +304,6 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)
> > {
> > int max_count = sysctl_hung_task_check_count;
> > unsigned long last_break = jiffies;
> > - unsigned long total_hung_task;
> > struct task_struct *g, *t;
> > unsigned long prev_detect_count = sysctl_hung_task_detect_count;
> > int need_warning = sysctl_hung_task_warnings;
> > @@ -320,20 +328,14 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)
> > last_break = jiffies;
> > }
> > - check_hung_task(t, timeout);
> > + check_hung_task(t, timeout, prev_detect_count);
> > }
> > unlock:
> > rcu_read_unlock();
> > - total_hung_task = sysctl_hung_task_detect_count - prev_detect_count;
> > - if (!total_hung_task)
> > + if (!(sysctl_hung_task_detect_count - prev_detect_count))
> > return;
> > - if (sysctl_hung_task_panic && total_hung_task >= sysctl_hung_task_panic) {
> > - console_verbose();
> > - hung_task_call_panic = true;
> > - }
> > -
> > if (need_warning || hung_task_call_panic) {
> > si_mask |= SYS_INFO_LOCKS;
>
> Looks good to me now! I assume v3 would be expected, can you
> post a new version?
Andrew has taken the patchset to -mm tree.
Andrew, which way do you prefer? I send a v3 patch for hung-task or you
pickup the fixup patch and squash it into the orginal 0002 patch?
Anyway, I make a squshed version v3 patch below.
Thanks,
Feng
---