From: Aaron Tomlin <atomlin@atomlin.com>
To: akpm@linux-foundation.org, lance.yang@linux.dev,
mhiramat@kernel.org, gregkh@linuxfoundation.org,
pmladek@suse.com
Cc: sean@ashe.io, linux-kernel@vger.kernel.org
Subject: [PATCH v2 1/2] hung_task: Consolidate hung task warning into an atomic log block
Date: Wed, 10 Dec 2025 22:30:03 -0500 [thread overview]
Message-ID: <20251211033004.1628875-2-atomlin@atomlin.com> (raw)
In-Reply-To: <20251211033004.1628875-1-atomlin@atomlin.com>
Consolidate the multi-line console output in check_hung_task() into a new
helper function, hung_task_diagnostics().
This patch ensures the entire diagnostic block (task info, kernel
version, and sysctl advice) is logged to the ring buffer via a single
pr_err() call. This is critical in a concurrent environment to prevent
message lines from interleaving with other CPU activity, thus
maintaining contextual integrity of the warning message.
Signed-off-by: Aaron Tomlin <atomlin@atomlin.com>
---
kernel/hung_task.c | 39 +++++++++++++++++++++++++++++----------
1 file changed, 29 insertions(+), 10 deletions(-)
diff --git a/kernel/hung_task.c b/kernel/hung_task.c
index d2254c91450b..6f3fb26378b5 100644
--- a/kernel/hung_task.c
+++ b/kernel/hung_task.c
@@ -223,6 +223,34 @@ static inline void debug_show_blocker(struct task_struct *task, unsigned long ti
}
#endif
+/**
+ * hung_task_diagnostics - Print structured diagnostic info for a hung task.
+ * @t: The struct task_struct of the detected hung task.
+ *
+ * This function consolidates the printing of core diagnostic information
+ * for a task found to be blocked. This approach ensures atomic logging
+ * of the multi-line message block, preventing interleaving by other
+ * console activity, thus maintaining contextual clarity.
+ */
+static inline void hung_task_diagnostics(struct task_struct *t)
+{
+ unsigned long blocked_secs = (jiffies - t->last_switch_time) / HZ;
+ const char *coredump_msg = "";
+ const char *disable_msg =
+ "\"echo 0 > /proc/sys/kernel/hung_task_timeout_secs\""
+ " disables this message.\n";
+
+ if (t->flags & PF_POSTCOREDUMP)
+ coredump_msg = " Blocked by coredump.\n";
+
+ pr_err("INFO: task %s:%d blocked for more than %ld seconds.\n"
+ " %s %s %.*s\n%s%s",
+ t->comm, t->pid, blocked_secs,
+ print_tainted(), init_utsname()->release,
+ (int)strcspn(init_utsname()->version, " "),
+ init_utsname()->version, coredump_msg, disable_msg);
+}
+
static void check_hung_task(struct task_struct *t, unsigned long timeout,
unsigned long prev_detect_count)
{
@@ -252,16 +280,7 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout,
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",
- t->comm, t->pid, (jiffies - t->last_switch_time) / HZ);
- pr_err(" %s %s %.*s\n",
- print_tainted(), init_utsname()->release,
- (int)strcspn(init_utsname()->version, " "),
- init_utsname()->version);
- if (t->flags & PF_POSTCOREDUMP)
- pr_err(" Blocked by coredump.\n");
- pr_err("\"echo 0 > /proc/sys/kernel/hung_task_timeout_secs\""
- " disables this message.\n");
+ hung_task_diagnostics(t);
sched_show_task(t);
debug_show_blocker(t, timeout);
--
2.51.0
next prev parent reply other threads:[~2025-12-11 3:30 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-11 3:30 [PATCH v2 0/2] hung_task: Provide runtime reset interface for hung task detector Aaron Tomlin
2025-12-11 3:30 ` Aaron Tomlin [this message]
2025-12-11 8:02 ` [PATCH v2 1/2] hung_task: Consolidate hung task warning into an atomic log block Greg KH
2025-12-15 23:44 ` Aaron Tomlin
2025-12-11 3:30 ` [PATCH v2 2/2] hung_task: Enable runtime reset of hung_task_detect_count Aaron Tomlin
2025-12-11 5:14 ` Lance Yang
2025-12-15 23:38 ` Aaron Tomlin
2025-12-11 15:49 ` kernel test robot
2025-12-15 5:00 ` kernel test robot
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=20251211033004.1628875-2-atomlin@atomlin.com \
--to=atomlin@atomlin.com \
--cc=akpm@linux-foundation.org \
--cc=gregkh@linuxfoundation.org \
--cc=lance.yang@linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=mhiramat@kernel.org \
--cc=pmladek@suse.com \
--cc=sean@ashe.io \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.