public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] mips: irq: add stackoverflow detection
@ 2010-08-26 13:19 ` Adam Jiang
  2010-08-26 19:00   ` Sergei Shtylyov
  0 siblings, 1 reply; 3+ messages in thread
From: Adam Jiang @ 2010-08-26 13:19 UTC (permalink / raw)
  To: ralf
  Cc: dmitri.vorobiev, wuzhangjin, ddaney, peterz, fweisbec, tj,
	linux-mips, linux-kernel, Adam Jiang

Add stackoverflow detection to mips arch
---
 arch/mips/Kconfig.debug |    7 +++++++
 arch/mips/kernel/irq.c  |   19 +++++++++++++++++++
 2 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/arch/mips/Kconfig.debug b/arch/mips/Kconfig.debug
index 43dc279..f1a00a2 100644
--- a/arch/mips/Kconfig.debug
+++ b/arch/mips/Kconfig.debug
@@ -67,6 +67,13 @@ config CMDLINE_OVERRIDE
 
 	  Normally, you will choose 'N' here.
 
+config DEBUG_STACKOVERFLOW
+	bool "Check for stack overflows"
+	depends on DEBUG_KERNEL
+	help
+	  This option will cause messages to be printed if free stack space
+	  drops below a certain limit.
+
 config DEBUG_STACK_USAGE
 	bool "Enable stack utilization instrumentation"
 	depends on DEBUG_KERNEL
diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c
index c6345f5..8fdf79e 100644
--- a/arch/mips/kernel/irq.c
+++ b/arch/mips/kernel/irq.c
@@ -151,6 +151,25 @@ void __init init_IRQ(void)
 #endif
 }
 
+#ifdef DEBUG_STACKOVERFLOW
+static inline void check_stack_overflow(void)
+{
+	long sp;
+
+	asm volatile("move %0, $sp" : "=r" (sp));
+	sp = sp & (THREAD_SIZE-1);
+
+	/* check for stack overflow: is there less than 2KB free? */
+	if (unlikely(sp < (sizeof(struct thread_info) + 2048))) {
+		printk("do_IRQ: stack overflow: %ld\n",
+		       sp - sizeof(struct thread_info));
+		dump_stack();
+	}
+}
+#else
+static inline void check_stack_overflow(void) {}
+#endif
+
 /*
  * do_IRQ handles all normal device IRQ's (the special
  * SMP cross-CPU interrupts have their own specific
-- 
1.7.1


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

* Re: [PATCH] mips: irq: add stackoverflow detection
  2010-08-26 13:19 ` [PATCH] mips: irq: add stackoverflow detection Adam Jiang
@ 2010-08-26 19:00   ` Sergei Shtylyov
  2010-08-26 23:30     ` Adam Jiang
  0 siblings, 1 reply; 3+ messages in thread
From: Sergei Shtylyov @ 2010-08-26 19:00 UTC (permalink / raw)
  To: Adam Jiang
  Cc: ralf, dmitri.vorobiev, wuzhangjin, ddaney, peterz, fweisbec, tj,
	linux-mips, linux-kernel

Hello.

Adam Jiang wrote:

> Add stackoverflow detection to mips arch

[...]

> diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c
> index c6345f5..8fdf79e 100644
> --- a/arch/mips/kernel/irq.c
> +++ b/arch/mips/kernel/irq.c
> @@ -151,6 +151,25 @@ void __init init_IRQ(void)
>  #endif
>  }
>  
> +#ifdef DEBUG_STACKOVERFLOW
> +static inline void check_stack_overflow(void)
> +{
> +	long sp;
> +
> +	asm volatile("move %0, $sp" : "=r" (sp));
> +	sp = sp & (THREAD_SIZE-1);
> +
> +	/* check for stack overflow: is there less than 2KB free? */
> +	if (unlikely(sp < (sizeof(struct thread_info) + 2048))) {
> +		printk("do_IRQ: stack overflow: %ld\n",
> +		       sp - sizeof(struct thread_info));
> +		dump_stack();
> +	}
> +}
> +#else
> +static inline void check_stack_overflow(void) {}
> +#endif
> +
>  /*
>   * do_IRQ handles all normal device IRQ's (the special
>   * SMP cross-CPU interrupts have their own specific

    You've dropped call check_stack_overflow() call in do_IRQ() -- was that 
intentional?

WBR, Sergei

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

* Re: [PATCH] mips: irq: add stackoverflow detection
  2010-08-26 19:00   ` Sergei Shtylyov
@ 2010-08-26 23:30     ` Adam Jiang
  0 siblings, 0 replies; 3+ messages in thread
From: Adam Jiang @ 2010-08-26 23:30 UTC (permalink / raw)
  To: linux-kernel

On Thu, Aug 26, 2010 at 11:00:49PM +0400, Sergei Shtylyov wrote:
> Hello.
> 
> Adam Jiang wrote:
> 
> >Add stackoverflow detection to mips arch
> 
> [...]
> 
> >diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c
> >index c6345f5..8fdf79e 100644
> >--- a/arch/mips/kernel/irq.c
> >+++ b/arch/mips/kernel/irq.c
> >@@ -151,6 +151,25 @@ void __init init_IRQ(void)
> > #endif
> > }
> >+#ifdef DEBUG_STACKOVERFLOW
> >+static inline void check_stack_overflow(void)
> >+{
> >+	long sp;
> >+
> >+	asm volatile("move %0, $sp" : "=r" (sp));
> >+	sp = sp & (THREAD_SIZE-1);
> >+
> >+	/* check for stack overflow: is there less than 2KB free? */
> >+	if (unlikely(sp < (sizeof(struct thread_info) + 2048))) {
> >+		printk("do_IRQ: stack overflow: %ld\n",
> >+		       sp - sizeof(struct thread_info));
> >+		dump_stack();
> >+	}
> >+}
> >+#else
> >+static inline void check_stack_overflow(void) {}
> >+#endif
> >+
> > /*
> >  * do_IRQ handles all normal device IRQ's (the special
> >  * SMP cross-CPU interrupts have their own specific
> 
>    You've dropped call check_stack_overflow() call in do_IRQ() --
> was that intentional?

Of course NO. It is awful, I have say.

I spent a lot of time to struggle with git yesterday. When I revised the
coding style problem and tried to format-patch to master branch, then I
got 2 patches but not all in one. How could I rebase my working copy and
get an all-in-one patch of this?

I tried to revert my commit and redo this patch, then I lost to calling
it in do_IRQ();

Best regards,
/Adam

> 
> WBR, Sergei

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

end of thread, other threads:[~2010-08-26 23:27 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <linux-mips@linux-mips.org>
2010-08-26 13:19 ` [PATCH] mips: irq: add stackoverflow detection Adam Jiang
2010-08-26 19:00   ` Sergei Shtylyov
2010-08-26 23:30     ` Adam Jiang

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