Re: x86: 4kstacks default

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Andi Kleen
Date: Sunday, April 20, 2008 - 5:36 am

Eric Sandeen <sandeen@sandeen.net> writes:

That could be easily fixed by executing the printk on the interrupt
stack on i386.  Currently it is before the stack switch which is wrong
agreed. On x86-64 it should already execute on the interrupt stack. Or
perhaps it would be better to just move the stack switch on i386 into
entry.S too similar to 64bit.

That wouldn't help without interrupt stacks of course, but these
should be always on anyways even with 8k stacks.

Experimental patch appended to do this.

-Andi

---

i386: Execute stack overflow warning on interrupt stack

Previously it would run on the process stack, which risks overflow
an already low stack. Instead execute it on the interrupt stack.

Based on an observation by Eric Sandeen.

Signed-off-by: Andi Kleen <andi@firstfloor.org>

Index: linux/arch/x86/kernel/irq_32.c
===================================================================
--- linux.orig/arch/x86/kernel/irq_32.c
+++ linux/arch/x86/kernel/irq_32.c
@@ -61,6 +61,26 @@ static union irq_ctx *hardirq_ctx[NR_CPU
 static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly;
 #endif
 
+static void stack_overflow(void)
+{
+	printk("low stack detected by irq handler\n");
+	dump_stack();
+}
+
+static inline void call_on_stack2(void *func, unsigned long stack,
+			   unsigned long arg1, unsigned long arg2)
+{
+	unsigned long bx;
+	asm volatile(
+			"       xchgl  %%ebx,%%esp    \n"
+			"       call   *%%edi         \n"
+			"       movl   %%ebx,%%esp    \n"
+			: "=a" (arg1), "=d" (arg2), "=b" (bx)
+			:  "0" (arg1),   "1" (arg2),  "2" (stack),
+			   "D" (func)
+			: "memory", "cc");
+}
+
 /*
  * do_IRQ handles all normal device IRQ's (the special
  * SMP cross-CPU interrupts have their own specific
@@ -76,6 +96,7 @@ unsigned int do_IRQ(struct pt_regs *regs
 	union irq_ctx *curctx, *irqctx;
 	u32 *isp;
 #endif
+	int overflow = 0;
 
 	if (unlikely((unsigned)irq >= NR_IRQS)) {
 		printk(KERN_EMERG "%s: cannot handle IRQ %d\n",
@@ -92,11 +113,8 @@ unsigned int do_IRQ(struct pt_regs *regs
 
 		__asm__ __volatile__("andl %%esp,%0" :
 					"=r" (sp) : "0" (THREAD_SIZE - 1));
-		if (unlikely(sp < (sizeof(struct thread_info) + STACK_WARN))) {
-			printk("do_IRQ: stack overflow: %ld\n",
-				sp - sizeof(struct thread_info));
-			dump_stack();
-		}
+		if (unlikely(sp < (sizeof(struct thread_info) + STACK_WARN)))
+			overflow = 1;
 	}
 #endif
 
@@ -112,8 +130,6 @@ unsigned int do_IRQ(struct pt_regs *regs
 	 * current stack (which is the irq stack already after all)
 	 */
 	if (curctx != irqctx) {
-		int arg1, arg2, bx;
-
 		/* build the stack frame on the IRQ stack */
 		isp = (u32*) ((char*)irqctx + sizeof(*irqctx));
 		irqctx->tinfo.task = curctx->tinfo.task;
@@ -127,18 +143,20 @@ unsigned int do_IRQ(struct pt_regs *regs
 			(irqctx->tinfo.preempt_count & ~SOFTIRQ_MASK) |
 			(curctx->tinfo.preempt_count & SOFTIRQ_MASK);
 
-		asm volatile(
-			"       xchgl  %%ebx,%%esp    \n"
-			"       call   *%%edi         \n"
-			"       movl   %%ebx,%%esp    \n"
-			: "=a" (arg1), "=d" (arg2), "=b" (bx)
-			:  "0" (irq),   "1" (desc),  "2" (isp),
-			   "D" (desc->handle_irq)
-			: "memory", "cc"
-		);
+		/* Execute warning on interrupt stack */
+		if (unlikely(overflow))
+			call_on_stack2(stack_overflow, isp, 0, 0);
+
+		call_on_stack2(desc->handle_irq, isp, irq, desc);
+
 	} else
 #endif
+	{
+		/* AK: Slightly bogus here */
+		if (overflow)
+			stack_overflow();
 		desc->handle_irq(irq, desc);
+	}
 
 	irq_exit();
 	set_irq_regs(old_regs);
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
Re: x86: 4kstacks default, Andrew Morton, (Fri Apr 18, 2:29 pm)
Re: x86: 4kstacks default, Ingo Molnar, (Sat Apr 19, 7:23 am)
Re: x86: 4kstacks default, Oliver Pinter, (Sat Apr 19, 7:35 am)
Re: x86: 4kstacks default, Shawn Bohrer, (Sat Apr 19, 7:59 am)
Re: x86: 4kstacks default, Adrian Bunk, (Sat Apr 19, 8:19 am)
Re: x86: 4kstacks default, Oliver Pinter, (Sat Apr 19, 8:42 am)
Re: x86: 4kstacks default, Andrew Morton, (Sat Apr 19, 10:49 am)
Re: x86: 4kstacks default, Arjan van de Ven, (Sat Apr 19, 11:00 am)
Re: x86: 4kstacks default, Ingo Molnar, (Sat Apr 19, 11:33 am)
Re: x86: 4kstacks default, Stefan Richter, (Sat Apr 19, 12:10 pm)
Re: x86: 4kstacks default, Eric Sandeen, (Sat Apr 19, 6:56 pm)
Re: x86: 4kstacks default, Eric Sandeen, (Sat Apr 19, 7:36 pm)
Re: x86: 4kstacks default, Eric Sandeen, (Sat Apr 19, 8:29 pm)
Re: x86: 4kstacks default, Arjan van de Ven, (Sat Apr 19, 11:11 pm)
Re: x86: 4kstacks default, Adrian Bunk, (Sun Apr 20, 12:42 am)
Re: x86: 4kstacks default, Alan Cox, (Sun Apr 20, 1:06 am)
Re: x86: 4kstacks default, Adrian Bunk, (Sun Apr 20, 1:09 am)
Re: x86: 4kstacks default, Adrian Bunk, (Sun Apr 20, 1:51 am)
Re: x86: 4kstacks default, Alan Cox, (Sun Apr 20, 2:36 am)
Re: x86: 4kstacks default, Adrian Bunk, (Sun Apr 20, 3:44 am)
Re: x86: 4kstacks default, Alan Cox, (Sun Apr 20, 4:02 am)
Re: x86: 4kstacks default, Alan Cox, (Sun Apr 20, 4:37 am)
Re: x86: 4kstacks default, Adrian Bunk, (Sun Apr 20, 4:54 am)
Re: x86: 4kstacks default, Adrian Bunk, (Sun Apr 20, 5:18 am)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 5:27 am)
Re: x86: 4kstacks default, Adrian Bunk, (Sun Apr 20, 5:32 am)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 5:36 am)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 5:37 am)
Re: x86: 4kstacks default, Willy Tarreau, (Sun Apr 20, 5:47 am)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 6:06 am)
Re: x86: 4kstacks default, Adrian Bunk, (Sun Apr 20, 6:21 am)
Re: x86: 4kstacks default, Mark Lord, (Sun Apr 20, 6:22 am)
Re: x86: 4kstacks default, Mark Lord, (Sun Apr 20, 6:27 am)
Re: x86: 4kstacks default, Adrian Bunk, (Sun Apr 20, 6:30 am)
Re: x86: 4kstacks default, Willy Tarreau, (Sun Apr 20, 6:34 am)
Re: x86: 4kstacks default, Willy Tarreau, (Sun Apr 20, 6:38 am)
Re: x86: 4kstacks default, Adrian Bunk, (Sun Apr 20, 7:04 am)
Re: x86: 4kstacks default, Eric Sandeen, (Sun Apr 20, 7:05 am)
Re: x86: 4kstacks default, Eric Sandeen, (Sun Apr 20, 7:09 am)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 7:19 am)
Re: x86: 4kstacks default, Willy Tarreau, (Sun Apr 20, 7:20 am)
Re: x86: 4kstacks default, Adrian Bunk, (Sun Apr 20, 7:21 am)
Re: x86: 4kstacks default, Eric Sandeen, (Sun Apr 20, 7:40 am)
Re: x86: 4kstacks default, Eric Sandeen, (Sun Apr 20, 7:56 am)
Re: x86: 4kstacks default, Arjan van de Ven, (Sun Apr 20, 8:41 am)
Re: x86: 4kstacks default, Daniel Hazelton, (Sun Apr 20, 8:44 am)
Re: x86: 4kstacks default, Adrian Bunk, (Sun Apr 20, 9:03 am)
Re: x86: 4kstacks default, Jörn, (Sun Apr 20, 9:41 am)
Re: x86: 4kstacks default, Chris Wedgwood, (Sun Apr 20, 9:59 am)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 10:19 am)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 10:26 am)
Re: x86: 4kstacks default, Jörn, (Sun Apr 20, 10:43 am)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 11:19 am)
Re: x86: 4kstacks default, Arjan van de Ven, (Sun Apr 20, 11:48 am)
Re: x86: 4kstacks default, Arjan van de Ven, (Sun Apr 20, 11:50 am)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 1:01 pm)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 1:09 pm)
Re: x86: 4kstacks default, Jörn, (Sun Apr 20, 1:32 pm)
Re: x86: 4kstacks default, Jörn, (Sun Apr 20, 1:35 pm)
Re: x86: 4kstacks default, Daniel Hazelton, (Sun Apr 20, 1:43 pm)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 2:40 pm)
Re: x86: 4kstacks default, Andrew Morton, (Sun Apr 20, 2:45 pm)
Re: x86: 4kstacks default, Andrew Morton, (Sun Apr 20, 2:50 pm)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 2:51 pm)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 2:55 pm)
Re: x86: 4kstacks default, Bernd Eckenfels, (Sun Apr 20, 3:17 pm)
Re: x86: 4kstacks default, Arjan van de Ven, (Sun Apr 20, 3:33 pm)
Re: x86: 4kstacks default, Arjan van de Ven, (Sun Apr 20, 3:33 pm)
Re: x86: 4kstacks default, David Chinner, (Sun Apr 20, 3:53 pm)
Re: x86: 4kstacks default, Andi Kleen, (Sun Apr 20, 4:16 pm)
Re: x86: 4kstacks default, Avi Kivity, (Sun Apr 20, 4:48 pm)
Re: x86: 4kstacks default, Daniel Hazelton, (Sun Apr 20, 6:45 pm)
Re: x86: 4kstacks default, Eric Sandeen, (Sun Apr 20, 8:06 pm)
Re: x86: 4kstacks default, Alexander E. Patrakov, (Sun Apr 20, 8:30 pm)
Re: x86: 4kstacks default, Arjan van de Ven, (Sun Apr 20, 10:53 pm)
Re: x86: 4kstacks default, Denys Vlasenko, (Mon Apr 21, 12:45 am)
Re: x86: 4kstacks default, Andi Kleen, (Mon Apr 21, 12:51 am)
Re: x86: 4kstacks default, Andi Kleen, (Mon Apr 21, 2:55 am)
Re: x86: 4kstacks default, Eric Sandeen, (Mon Apr 21, 6:29 am)
Re: x86: 4kstacks default, Ingo Molnar, (Mon Apr 21, 7:29 am)
Re: x86: 4kstacks default, Ingo Molnar, (Mon Apr 21, 7:31 am)
Re: x86: 4kstacks default, Daniel Hazelton, (Mon Apr 21, 10:34 am)
Re: x86: 4kstacks default, Denys Vlasenko, (Mon Apr 21, 12:51 pm)
Re: x86: 4kstacks default, Denys Vlasenko, (Mon Apr 21, 1:28 pm)
Re: x86: 4kstacks default, David Chinner, (Mon Apr 21, 6:28 pm)
[PATCH] xfs: do not pass size into kmem_free, it's unused, Denys Vlasenko, (Mon Apr 21, 7:33 pm)
[PATCH] xfs: do not pass unused params to xfs_flush_pages, Denys Vlasenko, (Mon Apr 21, 8:03 pm)
[PATCH] xfs: remove unused parameter of xfs_qm_dqpurge, Denys Vlasenko, (Tue Apr 22, 2:42 am)
Re: x86: 4kstacks default, Denys Vlasenko, (Tue Apr 22, 5:48 am)
Re: x86: 4kstacks default, Adrian Bunk, (Tue Apr 22, 6:01 am)
[PATCH] xfs: expose no-op xfs_put_perag(), Denys Vlasenko, (Tue Apr 22, 6:46 am)
Re: x86: 4kstacks default, Denys Vlasenko, (Tue Apr 22, 6:51 am)
Re: [PATCH] xfs: expose no-op xfs_put_perag(), Eric Sandeen, (Tue Apr 22, 7:08 am)
Re: [PATCH] xfs: #define out unused parameters , Denys Vlasenko, (Tue Apr 22, 10:50 am)
Re: x86: 4kstacks default, Romano Giannetti, (Tue Apr 22, 11:20 am)
Re: [PATCH] xfs: #define out unused parameters , Denys Vlasenko, (Tue Apr 22, 1:46 pm)
Re: [PATCH] xfs: expose no-op xfs_put_perag(), David Chinner, (Tue Apr 22, 4:16 pm)
Re: x86: 4kstacks default, Denys Vlasenko, (Tue Apr 22, 10:03 pm)
Re: x86: 4kstacks default, Daniel Hazelton, (Tue Apr 22, 10:21 pm)
Re: x86: 4kstacks default, david, (Tue Apr 22, 10:25 pm)
Re: x86: 4kstacks default, Benjamin Herrenschmidt, (Tue Apr 22, 10:27 pm)
Re: x86: 4kstacks default, Daniel Hazelton, (Tue Apr 22, 10:41 pm)
Re: x86: 4kstacks default, Romano Giannetti, (Wed Apr 23, 12:46 am)
Re: [PATCH] xfs: remove unused parameter of xfs_qm_dqpurge, Christoph Hellwig, (Wed Apr 23, 1:18 am)
Re: x86: 4kstacks default, Helge Hafting, (Wed Apr 23, 1:57 am)
Re: x86: 4kstacks default, Helge Hafting, (Wed Apr 23, 2:13 am)
Re: x86: 4kstacks default, Stefan Richter, (Wed Apr 23, 4:24 am)
Re: x86: 4kstacks default, Romano Giannetti, (Wed Apr 23, 5:15 am)
Re: x86: 4kstacks default, Lennart Sorensen, (Wed Apr 23, 8:59 am)
Re: x86: 4kstacks default, David Chinner, (Wed Apr 23, 4:29 pm)
Re: x86: 4kstacks default, David Chinner, (Wed Apr 23, 4:36 pm)
Re: x86: 4kstacks default, Arjan van de Ven, (Wed Apr 23, 5:45 pm)
Re: x86: 4kstacks default, Benjamin Herrenschmidt, (Wed Apr 23, 5:56 pm)
Re: x86: 4kstacks default, Christoph Hellwig, (Thu Apr 24, 2:52 am)
Re: x86: 4kstacks default, Peter Zijlstra, (Thu Apr 24, 5:25 am)
Re: x86: 4kstacks default, Chris Mason, (Thu Apr 24, 8:41 am)
Re: x86: 4kstacks default, Eric Sandeen, (Thu Apr 24, 8:46 am)
Re: x86: 4kstacks default, Alexander van Heukelum, (Thu Apr 24, 11:30 am)
Re: x86: 4kstacks default, Jörn, (Sun Apr 27, 12:27 pm)
Re: x86: 4kstacks default, Denys Vlasenko, (Sun Apr 27, 4:02 pm)
Re: x86: 4kstacks default, Eric Sandeen, (Sun Apr 27, 4:08 pm)
Re: x86: 4kstacks default, Denys Vlasenko, (Sun Apr 27, 5:00 pm)
Re: x86: 4kstacks default, Bill Davidsen, (Mon Apr 28, 10:56 am)
Re: x86: 4kstacks default, Bill Davidsen, (Mon Apr 28, 11:38 am)