diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2008-10-28 06:10:21 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2008-10-28 06:12:06 -0400 |
commit | 7f5a8ba6b0297ca941f43f8f5cbf0e5c8c4dd916 (patch) | |
tree | 8077f6d850ce26d8a33e505238c5b4848c5a9c6d /arch | |
parent | 46e7951f9431b5e6bfbeb3044fdb4b522f58101c (diff) |
[S390] No more 4kb stacks.
We got a stack overflow with a small stack configuration on a 32 bit
system. It just looks like as 4kb isn't enough and too dangerous.
So lets get rid of 4kb stacks on 32 bit.
But one thing I completely dislike about the call trace below is that
just for debugging or tracing purposes sprintf gets called (cio_start_key):
/* process condition code */
sprintf(dbf_txt, "ccode:%d", ccode);
CIO_TRACE_EVENT(4, dbf_txt);
But maybe its just me who thinks that this could be done better.
<4>Kernel stack overflow.
<4>Modules linked in: dm_multipath sunrpc bonding qeth_l2 dm_mod qeth ccwgroup vmur
<4>CPU: 1 Not tainted 2.6.27-30.x.20081015-s390default #1
<4>Process httpd (pid: 3807, task: 20ae2df8, ksp: 1666fb78)
<4>Krnl PSW : 040c0000 8027098a (number+0xe/0x348)
<4> R:0 T:1 IO:0 EX:0 Key:0 M:1 W:0 P:0 AS:0 CC:0 PM:0
<4>Krnl GPRS: 00d43318 0027097c 1666f277 9666f270
<4> 00000000 00000000 0000000a ffffffff
<4> 9666f270 1666f228 1666f277 1666f098
<4> 00000002 80270982 80271016 1666f098
<4>Krnl Code: 8027097e: f0340dd0a7f1 srp 3536(4,%r0),2033(%r10),4
<4> 80270984: 0f00 clcl %r0,%r0
<4> 80270986: a7840001 brc 8,80270988
<4> >8027098a: 18ef lr %r14,%r15
<4> 8027098c: a7faff68 ahi %r15,-152
<4> 80270990: 18bf lr %r11,%r15
<4> 80270992: 18a2 lr %r10,%r2
<4> 80270994: 1893 lr %r9,%r3
Modified calltrace with annotated stackframe size of each function:
stackframe size
|
0 304 vsnprintf+850 [0x271016]
1 72 sprintf+74 [0x271522]
2 56 cio_start_key+262 [0x2d4c16]
3 56 ccw_device_start_key+222 [0x2dfe92]
4 56 ccw_device_start+40 [0x2dff28]
5 48 raw3215_start_io+104 [0x30b0f8]
6 56 raw3215_write+494 [0x30ba0a]
7 40 con3215_write+68 [0x30bafc]
8 40 __call_console_drivers+146 [0x12b0fa]
9 32 _call_console_drivers+102 [0x12b192]
10 64 release_console_sem+268 [0x12b614]
11 168 vprintk+462 [0x12bca6]
12 72 printk+68 [0x12bfd0]
13 256 __print_symbol+50 [0x15a882]
14 56 __show_trace+162 [0x103d06]
15 32 show_trace+224 [0x103e70]
16 48 show_stack+152 [0x103f20]
17 56 dump_stack+126 [0x104612]
18 96 __alloc_pages_internal+592 [0x175004]
19 80 cache_alloc_refill+776 [0x196f3c]
20 40 __kmalloc+258 [0x1972ae]
21 40 __alloc_skb+94 [0x328086]
22 32 pskb_copy+50 [0x328252]
23 32 skb_realloc_headroom+110 [0x328a72]
24 104 qeth_l2_hard_start_xmit+378 [0x7803bfde]
25 56 dev_hard_start_xmit+450 [0x32ef6e]
26 56 __qdisc_run+390 [0x3425d6]
27 48 dev_queue_xmit+410 [0x331e06]
28 40 ip_finish_output+308 [0x354ac8]
29 56 ip_output+218 [0x355b6e]
30 24 ip_local_out+56 [0x354584]
31 120 ip_queue_xmit+300 [0x355cec]
32 96 tcp_transmit_skb+812 [0x367da8]
33 40 tcp_push_one+158 [0x369fda]
34 112 tcp_sendmsg+852 [0x35d5a0]
35 240 sock_sendmsg+164 [0x32035c]
36 56 kernel_sendmsg+86 [0x32064a]
37 88 sock_no_sendpage+98 [0x322b22]
38 104 tcp_sendpage+70 [0x35cc1e]
39 48 sock_sendpage+74 [0x31eb66]
40 64 pipe_to_sendpage+102 [0x1c4b2e]
41 64 __splice_from_pipe+120 [0x1c5340]
42 72 splice_from_pipe+90 [0x1c57e6]
43 56 generic_splice_sendpage+38 [0x1c5832]
44 48 do_splice_from+104 [0x1c4c38]
45 48 direct_splice_actor+52 [0x1c4c88]
46 80 splice_direct_to_actor+180 [0x1c4f80]
47 72 do_splice_direct+70 [0x1c5112]
48 64 do_sendfile+360 [0x19de18]
49 72 sys_sendfile64+126 [0x19df32]
50 336 sysc_do_restart+18 [0x111a1a]
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/s390/Kconfig | 14 | ||||
-rw-r--r-- | arch/s390/include/asm/thread_info.h | 5 |
2 files changed, 6 insertions, 13 deletions
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 5f5c29269fb1..8116a3328a19 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -241,19 +241,17 @@ config PACK_STACK | |||
241 | Say Y if you are unsure. | 241 | Say Y if you are unsure. |
242 | 242 | ||
243 | config SMALL_STACK | 243 | config SMALL_STACK |
244 | bool "Use 4kb/8kb for kernel stack instead of 8kb/16kb" | 244 | bool "Use 8kb for kernel stack instead of 16kb" |
245 | depends on PACK_STACK && !LOCKDEP | 245 | depends on PACK_STACK && 64BIT && !LOCKDEP |
246 | help | 246 | help |
247 | If you say Y here and the compiler supports the -mkernel-backchain | 247 | If you say Y here and the compiler supports the -mkernel-backchain |
248 | option the kernel will use a smaller kernel stack size. For 31 bit | 248 | option the kernel will use a smaller kernel stack size. The reduced |
249 | the reduced size is 4kb instead of 8kb and for 64 bit it is 8kb | 249 | size is 8kb instead of 16kb. This allows to run more threads on a |
250 | instead of 16kb. This allows to run more thread on a system and | 250 | system and reduces the pressure on the memory management for higher |
251 | reduces the pressure on the memory management for higher order | 251 | order page allocations. |
252 | page allocations. | ||
253 | 252 | ||
254 | Say N if you are unsure. | 253 | Say N if you are unsure. |
255 | 254 | ||
256 | |||
257 | config CHECK_STACK | 255 | config CHECK_STACK |
258 | bool "Detect kernel stack overflow" | 256 | bool "Detect kernel stack overflow" |
259 | help | 257 | help |
diff --git a/arch/s390/include/asm/thread_info.h b/arch/s390/include/asm/thread_info.h index de3fad60c682..c1eaf9604da7 100644 --- a/arch/s390/include/asm/thread_info.h +++ b/arch/s390/include/asm/thread_info.h | |||
@@ -15,13 +15,8 @@ | |||
15 | * Size of kernel stack for each process | 15 | * Size of kernel stack for each process |
16 | */ | 16 | */ |
17 | #ifndef __s390x__ | 17 | #ifndef __s390x__ |
18 | #ifndef __SMALL_STACK | ||
19 | #define THREAD_ORDER 1 | 18 | #define THREAD_ORDER 1 |
20 | #define ASYNC_ORDER 1 | 19 | #define ASYNC_ORDER 1 |
21 | #else | ||
22 | #define THREAD_ORDER 0 | ||
23 | #define ASYNC_ORDER 0 | ||
24 | #endif | ||
25 | #else /* __s390x__ */ | 20 | #else /* __s390x__ */ |
26 | #ifndef __SMALL_STACK | 21 | #ifndef __SMALL_STACK |
27 | #define THREAD_ORDER 2 | 22 | #define THREAD_ORDER 2 |