From: "Paolo 'Blaisorblade' Giarrusso" The C99 initialization, with GCC's bad handling, for 6K wide structs (which _aren't_ on the stack), is causing GCC to use 12K for these silly procs with 3 vars. Workaround this. Note that .name = { '\0' } translates to memset(->name, 0, '->name' size) - I verified this with GCC's docs and a testprogram. Signed-off-by: Paolo 'Blaisorblade' Giarrusso Cc: Jeff Dike Signed-off-by: Andrew Morton --- arch/um/drivers/slip_common.h | 13 +++++++------ arch/um/drivers/slip_kern.c | 15 ++++++++------- arch/um/drivers/slirp_kern.c | 13 +++++++------ 3 files changed, 22 insertions(+), 19 deletions(-) diff -puN arch/um/drivers/slip_common.h~uml-fix-hugest-stack-users arch/um/drivers/slip_common.h --- devel/arch/um/drivers/slip_common.h~uml-fix-hugest-stack-users 2006-01-18 20:28:26.000000000 -0800 +++ devel-akpm/arch/um/drivers/slip_common.h 2006-01-18 20:28:26.000000000 -0800 @@ -88,12 +88,13 @@ struct slip_proto { int esc; }; -#define SLIP_PROTO_INIT { \ - .ibuf = { '\0' }, \ - .obuf = { '\0' }, \ - .more = 0, \ - .pos = 0, \ - .esc = 0 \ +static inline void slip_proto_init(struct slip_proto * slip) +{ + memset(slip->ibuf, 0, sizeof(slip->ibuf)); + memset(slip->obuf, 0, sizeof(slip->obuf)); + slip->more = 0; + slip->pos = 0; + slip->esc = 0; } extern int slip_proto_read(int fd, void *buf, int len, diff -puN arch/um/drivers/slip_kern.c~uml-fix-hugest-stack-users arch/um/drivers/slip_kern.c --- devel/arch/um/drivers/slip_kern.c~uml-fix-hugest-stack-users 2006-01-18 20:28:26.000000000 -0800 +++ devel-akpm/arch/um/drivers/slip_kern.c 2006-01-18 20:28:26.000000000 -0800 @@ -21,13 +21,14 @@ void slip_init(struct net_device *dev, v private = dev->priv; spri = (struct slip_data *) private->user; - *spri = ((struct slip_data) - { .name = { '\0' }, - .addr = NULL, - .gate_addr = init->gate_addr, - .slave = -1, - .slip = SLIP_PROTO_INIT, - .dev = dev }); + + memset(spri->name, 0, sizeof(spri->name)); + spri->addr = NULL; + spri->gate_addr = init->gate_addr; + spri->slave = -1; + spri->dev = dev; + + slip_proto_init(&spri->slip); dev->init = NULL; dev->header_cache_update = NULL; diff -puN arch/um/drivers/slirp_kern.c~uml-fix-hugest-stack-users arch/um/drivers/slirp_kern.c --- devel/arch/um/drivers/slirp_kern.c~uml-fix-hugest-stack-users 2006-01-18 20:28:26.000000000 -0800 +++ devel-akpm/arch/um/drivers/slirp_kern.c 2006-01-18 20:28:26.000000000 -0800 @@ -21,12 +21,13 @@ void slirp_init(struct net_device *dev, private = dev->priv; spri = (struct slirp_data *) private->user; - *spri = ((struct slirp_data) - { .argw = init->argw, - .pid = -1, - .slave = -1, - .slip = SLIP_PROTO_INIT, - .dev = dev }); + + spri->argw = init->argw; + spri->pid = -1; + spri->slave = -1; + spri->dev = dev; + + slip_proto_init(&spri->slip); dev->init = NULL; dev->hard_header_len = 0; _