From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out30-113.freemail.mail.aliyun.com (out30-113.freemail.mail.aliyun.com [115.124.30.113]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7E6578634C for ; Sun, 16 Nov 2025 09:11:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=115.124.30.113 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763284322; cv=none; b=M93I3ClfmFDqrZ0LKlngd2kUIdZL0U+k03cCC6qyHWalt6AEi5D2+Or3VPU+aefSBY0fSRDwRE3QRsXC1QcOKHPSlvlVyda869psDTC6XNr7JoyxVJSKH3r0JBBOQah79dMA7kItZZueDPhYaiRpwfGkbULzG0iwgSi3+d3pjsQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763284322; c=relaxed/simple; bh=fIOHP56hajrIhv/etsEnA+fFaMkgO5wvPUCFRom69o8=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=uPogyDOFqNrRYxpdK2iZbA0H2u/+hIsQqJTCS733kzD/cGbVpY0lKKsOg21lhQlo8hDxBEFuVmPhCz/7Wt0mk+1Rk1bnGPhzFVaLuP3/dHpwcIdlkPd9yPitUa3tcgPmzke5s2aVyVliQmduIEKCmK1js8VPiy60/E7PXSlrpRc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com; spf=pass smtp.mailfrom=linux.alibaba.com; dkim=pass (1024-bit key) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.b=gD6zBF4A; arc=none smtp.client-ip=115.124.30.113 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.alibaba.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.alibaba.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.alibaba.com header.i=@linux.alibaba.com header.b="gD6zBF4A" DKIM-Signature:v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1763284311; h=Date:From:To:Subject:Message-ID:MIME-Version:Content-Type; bh=ONzL3h4S/ZkFbVHiuHnSn9+pheQCJ08CqIcVpcMbZM4=; b=gD6zBF4AvKwjXNMKlLhMlpYuPyhtAHznMFFe7AKVJx6gSEFpYxW2d9IWbW8otcGn17YHd6SUmc8ltykvEp6uodjOZwW+EUxlIABhUX8UegOnTSo+hUIKoWVhxAassAT2LGGQCtj14nu+IN72C7OhuIvFAW3V9K6vxjsNOucHXDk= Received: from localhost(mailfrom:feng.tang@linux.alibaba.com fp:SMTPD_---0WsS3xcq_1763284309 cluster:ay36) by smtp.aliyun-inc.com; Sun, 16 Nov 2025 17:11:49 +0800 Date: Sun, 16 Nov 2025 17:11:48 +0800 From: Feng Tang To: Lance Yang Cc: Petr Mladek , Andrew Morton , Steven Rostedt , Lance Yang , linux-kernel@vger.kernel.org, Jonathan Corbet , paulmck@kernel.org, lirongqing@baidu.com, leonylgao@tencent.com Subject: Re: [PATCH v2 2/4] hung_task: Add hung_task_sys_info sysctl to dump sys info on task-hung Message-ID: References: <20251113111039.22701-1-feng.tang@linux.alibaba.com> <20251113111039.22701-3-feng.tang@linux.alibaba.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: On Sun, Nov 16, 2025 at 03:58:32PM +0800, Lance Yang wrote: > > > On 2025/11/13 19:10, Feng Tang wrote: > > When task-hung happens, developers may need different kinds of system > > information (call-stacks, memory info, locks, etc.) to help debugging. > > > > Add 'hung_task_sys_info' sysctl knob to take human readable string like > > "tasks,mem,timers,locks,ftrace,...", and when task-hung happens, all > > requested information will be dumped. (refer kernel/sys_info.c for more > > details). > > > > Meanwhile, the newly introduced sys_info() call is used to unify some > > existing info-dumping knobs. > > > > Suggested-by: Petr Mladek > > Signed-off-by: Feng Tang > > --- > > Documentation/admin-guide/sysctl/kernel.rst | 5 ++ > > kernel/hung_task.c | 62 +++++++++++++-------- > > 2 files changed, 43 insertions(+), 24 deletions(-) > > * Ok, the task did not get scheduled for more than 2 minutes, > > * complain: > > */ > > - if (sysctl_hung_task_warnings || hung_task_call_panic) { > > + if (sysctl_hung_task_warnings) { > > It seems like the behavior changes when sysctl_hung_task_warnings is > 0 but a panic is about to be triggered ... > > 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@gmail.com > [2] https://lore.kernel.org/all/20251015063615.2632-1-lirongqing@baidu.com > [...] 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;