public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH v3 0/2] hung_task: Display every hung task warning
@ 2014-01-15 16:27 atomlin
  2014-01-15 16:27 ` [RFC PATCH v3 1/2] sysctl: Make neg_one a standard constraint atomlin
  2014-01-15 16:27 ` [RFC PATCH v3 2/2] hung_task: Display every hung task warning atomlin
  0 siblings, 2 replies; 4+ messages in thread
From: atomlin @ 2014-01-15 16:27 UTC (permalink / raw)
  To: linux-kernel; +Cc: mingo, oleg, riel, akpm

From: Aaron Tomlin <atomlin@redhat.com>

When khungtaskd detects hung tasks, it prints out
backtraces from a number of those tasks. Sometimes
the information on why things are stuck is hidden
in those backtraces. Limiting the number of
backtraces being printed out can result in the user
not seeing the information necessary to debug the
issue. This patch introduces an option to print an
unlimited number of backtraces when khungtaskd
detects hung tasks.

While ULONG_MAX is practically "inf", this patch
takes it one step further.  Note: The maximum is
now 2^31-1 (INT_MAX) which should hopefully be
sufficient.

Rebased against v3.13-rc8.

Aaron Tomlin (2):
  sysctl: Make neg_one a standard constraint
  hung_task: Display every hung task warning

 include/linux/sched/sysctl.h | 2 +-
 kernel/hung_task.c           | 6 ++++--
 kernel/sysctl.c              | 6 ++++--
 3 files changed, 9 insertions(+), 5 deletions(-)

-- 
1.8.4.2


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [RFC PATCH v3 1/2] sysctl: Make neg_one a standard constraint
  2014-01-15 16:27 [RFC PATCH v3 0/2] hung_task: Display every hung task warning atomlin
@ 2014-01-15 16:27 ` atomlin
  2014-01-15 16:27 ` [RFC PATCH v3 2/2] hung_task: Display every hung task warning atomlin
  1 sibling, 0 replies; 4+ messages in thread
From: atomlin @ 2014-01-15 16:27 UTC (permalink / raw)
  To: linux-kernel; +Cc: mingo, oleg, riel, akpm

From: Aaron Tomlin <atomlin@redhat.com>

Add neg_one to the list of standard constraints.

Signed-off-by: Aaron Tomlin <atomlin@redhat.com>
---
 kernel/sysctl.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 34a6047..dd531a6 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -122,6 +122,7 @@ extern int blk_iopoll_enabled;
 static int sixty = 60;
 #endif
 
+static int neg_one = -1;
 static int zero;
 static int __maybe_unused one = 1;
 static int __maybe_unused two = 2;
-- 
1.8.4.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [RFC PATCH v3 2/2] hung_task: Display every hung task warning
  2014-01-15 16:27 [RFC PATCH v3 0/2] hung_task: Display every hung task warning atomlin
  2014-01-15 16:27 ` [RFC PATCH v3 1/2] sysctl: Make neg_one a standard constraint atomlin
@ 2014-01-15 16:27 ` atomlin
  2014-01-15 20:56   ` David Rientjes
  1 sibling, 1 reply; 4+ messages in thread
From: atomlin @ 2014-01-15 16:27 UTC (permalink / raw)
  To: linux-kernel; +Cc: mingo, oleg, riel, akpm

From: Aaron Tomlin <atomlin@redhat.com>

When khungtaskd detects hung tasks, it prints out
backtraces from a number of those tasks. Sometimes
the information on why things are stuck is hidden
in those backtraces. Limiting the number of
backtraces being printed out can result in the user
not seeing the information necessary to debug the
issue. This patch introduces an option to print an
unlimited number of backtraces when khungtaskd
detects hung tasks.

While ULONG_MAX is practically "inf", this patch
takes it one step further.  Note: The maximum is
now 2^31-1 (INT_MAX) which should hopefully be
sufficient.

Signed-off-by: Aaron Tomlin <atomlin@redhat.com>
---
 include/linux/sched/sysctl.h | 2 +-
 kernel/hung_task.c           | 6 ++++--
 kernel/sysctl.c              | 5 +++--
 3 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h
index 41467f8..eb3c72d7 100644
--- a/include/linux/sched/sysctl.h
+++ b/include/linux/sched/sysctl.h
@@ -5,7 +5,7 @@
 extern int	     sysctl_hung_task_check_count;
 extern unsigned int  sysctl_hung_task_panic;
 extern unsigned long sysctl_hung_task_timeout_secs;
-extern unsigned long sysctl_hung_task_warnings;
+extern int sysctl_hung_task_warnings;
 extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write,
 					 void __user *buffer,
 					 size_t *lenp, loff_t *ppos);
diff --git a/kernel/hung_task.c b/kernel/hung_task.c
index 9328b80..0b9c169 100644
--- a/kernel/hung_task.c
+++ b/kernel/hung_task.c
@@ -37,7 +37,7 @@ int __read_mostly sysctl_hung_task_check_count = PID_MAX_LIMIT;
  */
 unsigned long __read_mostly sysctl_hung_task_timeout_secs = CONFIG_DEFAULT_HUNG_TASK_TIMEOUT;
 
-unsigned long __read_mostly sysctl_hung_task_warnings = 10;
+int __read_mostly sysctl_hung_task_warnings = 10;
 
 static int __read_mostly did_panic;
 
@@ -98,7 +98,9 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout)
 
 	if (!sysctl_hung_task_warnings)
 		return;
-	sysctl_hung_task_warnings--;
+
+	if (sysctl_hung_task_warnings > 0)
+		sysctl_hung_task_warnings--;
 
 	/*
 	 * Ok, the task did not get scheduled for more than 2 minutes,
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index dd531a6..b50cd13 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -985,9 +985,10 @@ static struct ctl_table kern_table[] = {
 	{
 		.procname	= "hung_task_warnings",
 		.data		= &sysctl_hung_task_warnings,
-		.maxlen		= sizeof(unsigned long),
+		.maxlen		= sizeof(int),
 		.mode		= 0644,
-		.proc_handler	= proc_doulongvec_minmax,
+		.proc_handler	= proc_dointvec_minmax,
+		.extra1		= &neg_one,
 	},
 #endif
 #ifdef CONFIG_COMPAT
-- 
1.8.4.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [RFC PATCH v3 2/2] hung_task: Display every hung task warning
  2014-01-15 16:27 ` [RFC PATCH v3 2/2] hung_task: Display every hung task warning atomlin
@ 2014-01-15 20:56   ` David Rientjes
  0 siblings, 0 replies; 4+ messages in thread
From: David Rientjes @ 2014-01-15 20:56 UTC (permalink / raw)
  To: atomlin; +Cc: linux-kernel, mingo, oleg, riel, akpm

On Wed, 15 Jan 2014, atomlin@redhat.com wrote:

> From: Aaron Tomlin <atomlin@redhat.com>
> 
> When khungtaskd detects hung tasks, it prints out
> backtraces from a number of those tasks. Sometimes
> the information on why things are stuck is hidden
> in those backtraces. Limiting the number of
> backtraces being printed out can result in the user
> not seeing the information necessary to debug the
> issue. This patch introduces an option to print an
> unlimited number of backtraces when khungtaskd
> detects hung tasks.
> 
> While ULONG_MAX is practically "inf", this patch
> takes it one step further.  Note: The maximum is
> now 2^31-1 (INT_MAX) which should hopefully be
> sufficient.
> 

This rationale is someone cryptic, it seems what you're doing is allowing 
the sysctl to be set to -1 that will never limit the number of warnings 
and to do that you need a signed value so you converted ulong to int.

> Signed-off-by: Aaron Tomlin <atomlin@redhat.com>
> ---
>  include/linux/sched/sysctl.h | 2 +-
>  kernel/hung_task.c           | 6 ++++--
>  kernel/sysctl.c              | 5 +++--
>  3 files changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h
> index 41467f8..eb3c72d7 100644
> --- a/include/linux/sched/sysctl.h
> +++ b/include/linux/sched/sysctl.h
> @@ -5,7 +5,7 @@
>  extern int	     sysctl_hung_task_check_count;
>  extern unsigned int  sysctl_hung_task_panic;
>  extern unsigned long sysctl_hung_task_timeout_secs;
> -extern unsigned long sysctl_hung_task_warnings;
> +extern int sysctl_hung_task_warnings;
>  extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write,
>  					 void __user *buffer,
>  					 size_t *lenp, loff_t *ppos);
> diff --git a/kernel/hung_task.c b/kernel/hung_task.c
> index 9328b80..0b9c169 100644
> --- a/kernel/hung_task.c
> +++ b/kernel/hung_task.c
> @@ -37,7 +37,7 @@ int __read_mostly sysctl_hung_task_check_count = PID_MAX_LIMIT;
>   */
>  unsigned long __read_mostly sysctl_hung_task_timeout_secs = CONFIG_DEFAULT_HUNG_TASK_TIMEOUT;
>  
> -unsigned long __read_mostly sysctl_hung_task_warnings = 10;
> +int __read_mostly sysctl_hung_task_warnings = 10;
>  
>  static int __read_mostly did_panic;
>  
> @@ -98,7 +98,9 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout)
>  
>  	if (!sysctl_hung_task_warnings)
>  		return;
> -	sysctl_hung_task_warnings--;
> +
> +	if (sysctl_hung_task_warnings > 0)
> +		sysctl_hung_task_warnings--;
>  
>  	/*
>  	 * Ok, the task did not get scheduled for more than 2 minutes,
> diff --git a/kernel/sysctl.c b/kernel/sysctl.c
> index dd531a6..b50cd13 100644
> --- a/kernel/sysctl.c
> +++ b/kernel/sysctl.c
> @@ -985,9 +985,10 @@ static struct ctl_table kern_table[] = {
>  	{
>  		.procname	= "hung_task_warnings",
>  		.data		= &sysctl_hung_task_warnings,
> -		.maxlen		= sizeof(unsigned long),
> +		.maxlen		= sizeof(int),
>  		.mode		= 0644,
> -		.proc_handler	= proc_doulongvec_minmax,
> +		.proc_handler	= proc_dointvec_minmax,
> +		.extra1		= &neg_one,
>  	},
>  #endif
>  #ifdef CONFIG_COMPAT

hung_task_warnings isn't documented in the source, so how is anybody 
supposed to know that -1 is an acceptable value and what it's special case 
allows?

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-01-15 20:57 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-15 16:27 [RFC PATCH v3 0/2] hung_task: Display every hung task warning atomlin
2014-01-15 16:27 ` [RFC PATCH v3 1/2] sysctl: Make neg_one a standard constraint atomlin
2014-01-15 16:27 ` [RFC PATCH v3 2/2] hung_task: Display every hung task warning atomlin
2014-01-15 20:56   ` David Rientjes

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox