From: Andi Kleen <andi@firstfloor.org>
To: Eric Sandeen <sandeen@sandeen.net>
Cc: Ingo Molnar <mingo@elte.hu>,
Andrew Morton <akpm@linux-foundation.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Arjan van de Ven <arjan@infradead.org>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: x86: 4kstacks default
Date: Sun, 20 Apr 2008 14:36:38 +0200 [thread overview]
Message-ID: <87prskaejt.fsf@basil.nowhere.org> (raw)
In-Reply-To: <480AB88C.1050900@sandeen.net> (Eric Sandeen's message of "Sat, 19 Apr 2008 22:29:16 -0500")
Eric Sandeen <sandeen@sandeen.net> writes:
>
> CONFIG_DEBUG_STACKOVERFLOW isn't ery useful because the warning printk
> it generates uses the remaining amount of stack, and tips the box.
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);
next prev parent reply other threads:[~2008-04-20 12:37 UTC|newest]
Thread overview: 162+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <200804181737.m3IHbabI010051@hera.kernel.org>
2008-04-18 21:29 ` x86: 4kstacks default Andrew Morton
2008-04-19 14:23 ` Ingo Molnar
2008-04-19 14:35 ` Oliver Pinter
2008-04-19 15:19 ` Adrian Bunk
2008-04-19 15:42 ` Oliver Pinter
2008-04-20 1:56 ` Eric Sandeen
2008-04-20 7:42 ` Adrian Bunk
2008-04-20 16:59 ` Chris Wedgwood
[not found] ` <480AA2B9.10305__23983.3358479247$1208657639$gmane$org@sandeen.net>
2008-04-20 11:48 ` Andi Kleen
2008-04-19 14:59 ` Shawn Bohrer
2008-04-19 18:00 ` Arjan van de Ven
2008-04-19 18:33 ` Ingo Molnar
2008-04-19 19:10 ` Stefan Richter
2008-04-20 2:36 ` Eric Sandeen
2008-04-20 6:11 ` Arjan van de Ven
2008-04-20 22:53 ` David Chinner
2008-04-20 8:09 ` Adrian Bunk
2008-04-20 8:06 ` Alan Cox
2008-04-20 8:51 ` Adrian Bunk
2008-04-20 9:36 ` Alan Cox
2008-04-20 10:44 ` Adrian Bunk
2008-04-20 11:02 ` Alan Cox
2008-04-20 11:54 ` Adrian Bunk
2008-04-20 11:37 ` Alan Cox
2008-04-20 12:18 ` Adrian Bunk
2008-04-20 14:05 ` Eric Sandeen
2008-04-20 14:21 ` Adrian Bunk
2008-04-20 14:56 ` Eric Sandeen
2008-04-20 15:41 ` Arjan van de Ven
2008-04-20 16:03 ` Adrian Bunk
2008-04-21 3:30 ` Alexander E. Patrakov
2008-04-23 8:57 ` Helge Hafting
2008-04-21 7:45 ` Denys Vlasenko
2008-04-21 9:55 ` Andi Kleen
2008-04-21 13:29 ` Eric Sandeen
2008-04-21 19:51 ` Denys Vlasenko
2008-04-21 20:28 ` Denys Vlasenko
2008-04-22 1:28 ` David Chinner
2008-04-22 2:33 ` [PATCH] xfs: do not pass size into kmem_free, it's unused Denys Vlasenko
2008-04-22 3:03 ` [PATCH] xfs: do not pass unused params to xfs_flush_pages Denys Vlasenko
2008-04-22 3:14 ` [PATCH] xfs: use smaller int param in call " Denys Vlasenko
2008-04-22 3:18 ` Eric Sandeen
2008-04-22 4:10 ` David Chinner
2008-04-22 9:42 ` [PATCH] xfs: remove unused parameter of xfs_qm_dqpurge Denys Vlasenko
2008-04-22 10:16 ` [PATCH] xfs: remove unused parameter of xfs_iomap_write_allocate Denys Vlasenko
2008-04-22 11:20 ` [PATCH] xfs: #define out unused parameters of xfs_bmap_add_free and xfs_btree_read_bufl Denys Vlasenko
2008-04-22 11:48 ` [PATCH] xfs: #define out unused parameters for seven functions in xfs_trans.h Denys Vlasenko
2008-04-22 11:51 ` Denys Vlasenko
2008-04-22 13:32 ` [PATCH] xfs: remove unused params from functions in xfs_dir2_leaf.h Denys Vlasenko
2008-04-22 13:40 ` [PATCH] xfs: remove unused params from functions in xfs/quota/* Denys Vlasenko
2008-04-22 13:46 ` [PATCH] xfs: expose no-op xfs_put_perag() Denys Vlasenko
2008-04-22 14:08 ` Eric Sandeen
2008-04-22 23:16 ` David Chinner
2008-04-22 23:08 ` [PATCH] xfs: remove unused params from functions in xfs/quota/* David Chinner
2008-04-22 22:47 ` [PATCH] xfs: #define out unused parameters for seven functions in xfs_trans.h David Chinner
2008-04-22 14:28 ` [PATCH] xfs: #define out unused parameters of xfs_bmap_add_free and xfs_btree_read_bufl Adrian Bunk
2008-04-22 16:17 ` Denys Vlasenko
2008-04-22 17:21 ` Adrian Bunk
2008-04-22 17:26 ` Eric Sandeen
2008-04-22 17:50 ` Denys Vlasenko
2008-04-22 18:28 ` [PATCH] xfs: #define out unused parameters of?xfs_bmap_add_free " Adrian Bunk
2008-04-22 19:32 ` Denys Vlasenko
2008-04-22 23:53 ` Adrian Bunk
2008-04-22 20:46 ` [PATCH] xfs: #define out unused parameters of xfs_bmap_add_free " Denys Vlasenko
2008-04-22 22:43 ` David Chinner
2008-04-22 22:33 ` [PATCH] xfs: remove unused parameter of xfs_iomap_write_allocate David Chinner
2008-04-22 22:11 ` [PATCH] xfs: remove unused parameter of xfs_qm_dqpurge David Chinner
2008-04-23 8:18 ` Christoph Hellwig
2008-04-22 22:08 ` [PATCH] xfs: use smaller int param in call to xfs_flush_pages David Chinner
2008-04-22 3:15 ` [PATCH] xfs: do not pass unused params " Eric Sandeen
2008-04-22 8:57 ` Denys Vlasenko
2008-04-22 9:56 ` Jakub Jelinek
2008-04-22 10:33 ` Denys Vlasenko
2008-04-22 12:51 ` Eric Sandeen
2008-04-22 22:07 ` David Chinner
2008-04-22 3:09 ` [PATCH] xfs: do not pass size into kmem_free, it's unused Eric Sandeen
2008-04-22 3:35 ` Eric Sandeen
2008-04-22 22:02 ` David Chinner
2008-04-22 12:48 ` x86: 4kstacks default Denys Vlasenko
2008-04-22 13:01 ` Adrian Bunk
2008-04-22 13:51 ` Denys Vlasenko
2008-04-27 19:27 ` Jörn Engel
2008-04-27 23:02 ` Denys Vlasenko
2008-04-27 23:08 ` Eric Sandeen
2008-04-28 0:00 ` Denys Vlasenko
2008-04-20 12:37 ` Andi Kleen
2008-04-20 12:27 ` Andi Kleen
2008-04-20 12:32 ` Adrian Bunk
2008-04-20 12:47 ` Willy Tarreau
2008-04-20 13:06 ` Andi Kleen
2008-04-20 13:30 ` Adrian Bunk
2008-04-20 13:34 ` Willy Tarreau
2008-04-20 14:04 ` Adrian Bunk
2008-04-28 17:56 ` Bill Davidsen
2008-04-20 13:21 ` Adrian Bunk
2008-04-23 9:13 ` Helge Hafting
2008-04-23 23:29 ` David Chinner
2008-04-24 15:46 ` Eric Sandeen
2008-04-28 18:38 ` Bill Davidsen
2008-04-20 13:27 ` Mark Lord
2008-04-20 13:38 ` Willy Tarreau
2008-04-20 14:19 ` Andi Kleen
2008-04-20 16:41 ` Jörn Engel
2008-04-20 17:19 ` Andi Kleen
2008-04-20 17:43 ` Jörn Engel
2008-04-20 18:19 ` Andi Kleen
2008-04-20 18:50 ` Arjan van de Ven
2008-04-20 20:09 ` Andi Kleen
2008-04-20 21:50 ` Andrew Morton
2008-04-20 21:55 ` Andi Kleen
2008-04-21 14:29 ` Ingo Molnar
2008-04-20 20:32 ` Jörn Engel
2008-04-20 20:35 ` Jörn Engel
2008-04-20 14:09 ` Eric Sandeen
2008-04-20 14:20 ` Willy Tarreau
2008-04-20 14:40 ` Eric Sandeen
2008-04-20 15:44 ` Daniel Hazelton
2008-04-20 17:26 ` Andi Kleen
2008-04-20 18:48 ` Arjan van de Ven
2008-04-20 20:01 ` Andi Kleen
2008-04-20 20:43 ` Daniel Hazelton
2008-04-20 21:40 ` Andi Kleen
2008-04-20 22:17 ` Bernd Eckenfels
2008-04-20 23:48 ` Avi Kivity
2008-04-21 1:45 ` Daniel Hazelton
2008-04-21 7:51 ` Andi Kleen
2008-04-21 17:34 ` Daniel Hazelton
2008-04-20 22:33 ` Arjan van de Ven
2008-04-20 22:33 ` Arjan van de Ven
2008-04-20 23:16 ` Andi Kleen
2008-04-21 5:53 ` Arjan van de Ven
2008-04-21 3:06 ` Eric Sandeen
2008-04-20 21:45 ` Andrew Morton
2008-04-20 21:51 ` Andi Kleen
2008-04-22 18:20 ` Romano Giannetti
2008-04-23 5:03 ` Denys Vlasenko
2008-04-23 5:21 ` Daniel Hazelton
2008-04-23 5:25 ` david
2008-04-23 5:41 ` Daniel Hazelton
2008-04-23 7:46 ` Romano Giannetti
2008-04-23 11:24 ` Stefan Richter
2008-04-23 12:15 ` Romano Giannetti
2008-04-23 15:59 ` Lennart Sorensen
2008-04-20 13:22 ` Mark Lord
2008-04-19 17:49 ` Andrew Morton
2008-04-25 17:39 ` Parag Warudkar
2008-04-20 3:29 ` Eric Sandeen
2008-04-20 12:36 ` Andi Kleen [this message]
2008-04-21 14:31 ` Ingo Molnar
2008-04-23 5:27 ` Benjamin Herrenschmidt
2008-04-23 23:36 ` David Chinner
2008-04-24 0:45 ` Arjan van de Ven
2008-04-24 9:52 ` Christoph Hellwig
2008-04-24 12:25 ` Peter Zijlstra
2008-04-24 15:41 ` Chris Mason
2008-04-24 18:30 ` Alexander van Heukelum
2008-04-24 0:56 ` Benjamin Herrenschmidt
[not found] <ak6tq-32p-7@gated-at.bofh.it>
[not found] ` <ak6tq-32p-5@gated-at.bofh.it>
2008-04-19 10:56 ` Bodo Eggert
[not found] ` <akFri-4yB-25@gated-at.bofh.it>
[not found] ` <akGQg-7TX-1@gated-at.bofh.it>
[not found] ` <akKhi-91-37@gated-at.bofh.it>
2008-04-20 20:23 ` Bodo Eggert
2008-04-20 20:59 ` Daniel Hazelton
2008-04-21 20:05 ` Bodo Eggert
2008-04-22 15:34 ` Daniel Hazelton
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=87prskaejt.fsf@basil.nowhere.org \
--to=andi@firstfloor.org \
--cc=akpm@linux-foundation.org \
--cc=arjan@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=sandeen@sandeen.net \
--cc=tglx@linutronix.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox