Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35c74226 authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Andi Kleen
Browse files

[PATCH] x86: deflate stack usage in lib/inflate.c



inflate_fixed and huft_build together use around 2.7k of stack.  When
using 4k stacks, I saw stack overflows from interrupts arriving while
unpacking the root initrd:

do_IRQ: stack overflow: 384
 [<c0106b64>] show_trace_log_lvl+0x1a/0x30
 [<c01075e6>] show_trace+0x12/0x14
 [<c010763f>] dump_stack+0x16/0x18
 [<c0107ca4>] do_IRQ+0x6d/0xd9
 [<c010202b>] xen_evtchn_do_upcall+0x6e/0xa2
 [<c0106781>] xen_hypervisor_callback+0x25/0x2c
 [<c010116c>] xen_restore_fl+0x27/0x29
 [<c0330f63>] _spin_unlock_irqrestore+0x4a/0x50
 [<c0117aab>] change_page_attr+0x577/0x584
 [<c0117b45>] kernel_map_pages+0x8d/0xb4
 [<c016a314>] cache_alloc_refill+0x53f/0x632
 [<c016a6c2>] __kmalloc+0xc1/0x10d
 [<c0463d34>] malloc+0x10/0x12
 [<c04641c1>] huft_build+0x2a7/0x5fa
 [<c04645a5>] inflate_fixed+0x91/0x136
 [<c04657e2>] unpack_to_rootfs+0x5f2/0x8c1
 [<c0465acf>] populate_rootfs+0x1e/0xe4

(This was under Xen, but there's no reason it couldn't happen on bare
  hardware.)

This patch mallocs the local variables, thereby reducing the stack
usage to sane levels.

Also, up the heap size for the kernel decompressor to deal with the
extra allocation.

Signed-off-by: default avatarJeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Cc: Tim Yamin <plasmaroo@gentoo.org>
Cc: Andi Kleen <ak@suse.de>
Cc: Matt Mackall <mpm@selenic.com>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Ian Molton <spyro@f2s.com>
parent 4cdd9c89
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -98,7 +98,7 @@ extern int end;
static ulg free_mem_ptr;
static ulg free_mem_ptr;
static ulg free_mem_ptr_end;
static ulg free_mem_ptr_end;


#define HEAP_SIZE 0x2000
#define HEAP_SIZE 0x3000


#include "../../../lib/inflate.c"
#include "../../../lib/inflate.c"


+1 −1
Original line number Original line Diff line number Diff line
@@ -239,7 +239,7 @@ extern int end;
static ulg free_mem_ptr;
static ulg free_mem_ptr;
static ulg free_mem_ptr_end;
static ulg free_mem_ptr_end;


#define HEAP_SIZE 0x2000
#define HEAP_SIZE 0x3000


#include "../../../../lib/inflate.c"
#include "../../../../lib/inflate.c"


+1 −1
Original line number Original line Diff line number Diff line
@@ -182,7 +182,7 @@ extern int end;
static ulg free_mem_ptr;
static ulg free_mem_ptr;
static ulg free_mem_ptr_end;
static ulg free_mem_ptr_end;


#define HEAP_SIZE 0x2000
#define HEAP_SIZE 0x3000


#include "../../../../lib/inflate.c"
#include "../../../../lib/inflate.c"


+1 −1
Original line number Original line Diff line number Diff line
@@ -189,7 +189,7 @@ static void putstr(const char *);
static unsigned long free_mem_ptr;
static unsigned long free_mem_ptr;
static unsigned long free_mem_end_ptr;
static unsigned long free_mem_end_ptr;


#define HEAP_SIZE             0x3000
#define HEAP_SIZE             0x4000


static char *vidmem = (char *)0xb8000;
static char *vidmem = (char *)0xb8000;
static int vidport;
static int vidport;
+1 −1
Original line number Original line Diff line number Diff line
@@ -189,7 +189,7 @@ static void putstr(const char *);
static long free_mem_ptr;
static long free_mem_ptr;
static long free_mem_end_ptr;
static long free_mem_end_ptr;


#define HEAP_SIZE             0x6000
#define HEAP_SIZE             0x7000


static char *vidmem = (char *)0xb8000;
static char *vidmem = (char *)0xb8000;
static int vidport;
static int vidport;
Loading