This patch reduces the kernel image size by making these 2 arrays automatic variables. tlbex.o~old => tlbex.o text: 9840 9812 -28 0% data: 3904 1344 -2560 -65% bss: 1568 1568 0 0% total: 15312 12724 -2588 -16% It increases the stack pressure a lot (more than 2500 bytes) but at this stage in the boot process, it shouldn't matter. Futhermore the TLB handler generator code doesn't have any deep call graph and probably won't. Signed-off-by: Franck Bui-Huu <fbuihuu@xxxxxxxxx> --- arch/mips/mm/tlbex.c | 32 ++++++++++++++------------------ 1 files changed, 14 insertions(+), 18 deletions(-) diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index 01b0961..ae1bf81 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c @@ -745,10 +745,6 @@ il_bgez(u32 **p, struct reloc **r, unsigned int reg, enum label_id l) */ static u32 tlb_handler[128] __initdata; -/* simply assume worst case size for labels and relocs */ -static struct label labels[128] __initdata; -static struct reloc relocs[128] __initdata; - /* * The R3000 TLB handler is simple. */ @@ -1250,8 +1246,8 @@ static void __init build_update_entries(u32 **p, unsigned int tmp, static void __init build_r4000_tlb_refill_handler(void) { u32 *p = tlb_handler; - struct label *l = labels; - struct reloc *r = relocs; + struct label labels[128], *l = labels; + struct reloc relocs[128], *r = relocs; u32 *f; unsigned int final_len; int i; @@ -1598,8 +1594,8 @@ build_r3000_tlbchange_handler_head(u32 **p, unsigned int pte, static void __init build_r3000_tlb_load_handler(void) { u32 *p = handle_tlbl; - struct label *l = labels; - struct reloc *r = relocs; + struct label labels[FASTPATH_SIZE], *l = labels; + struct reloc relocs[FASTPATH_SIZE], *r = relocs; int i; memset(handle_tlbl, 0, sizeof(handle_tlbl)); @@ -1633,8 +1629,8 @@ static void __init build_r3000_tlb_load_handler(void) static void __init build_r3000_tlb_store_handler(void) { u32 *p = handle_tlbs; - struct label *l = labels; - struct reloc *r = relocs; + struct label labels[FASTPATH_SIZE], *l = labels; + struct reloc relocs[FASTPATH_SIZE], *r = relocs; int i; memset(handle_tlbs, 0, sizeof(handle_tlbs)); @@ -1668,8 +1664,8 @@ static void __init build_r3000_tlb_store_handler(void) static void __init build_r3000_tlb_modify_handler(void) { u32 *p = handle_tlbm; - struct label *l = labels; - struct reloc *r = relocs; + struct label labels[FASTPATH_SIZE], *l = labels; + struct reloc relocs[FASTPATH_SIZE], *r = relocs; int i; memset(handle_tlbm, 0, sizeof(handle_tlbm)); @@ -1748,8 +1744,8 @@ build_r4000_tlbchange_handler_tail(u32 **p, struct label **l, static void __init build_r4000_tlb_load_handler(void) { u32 *p = handle_tlbl; - struct label *l = labels; - struct reloc *r = relocs; + struct label labels[FASTPATH_SIZE], *l = labels; + struct reloc relocs[FASTPATH_SIZE], *r = relocs; int i; memset(handle_tlbl, 0, sizeof(handle_tlbl)); @@ -1793,8 +1789,8 @@ static void __init build_r4000_tlb_load_handler(void) static void __init build_r4000_tlb_store_handler(void) { u32 *p = handle_tlbs; - struct label *l = labels; - struct reloc *r = relocs; + struct label labels[FASTPATH_SIZE], *l = labels; + struct reloc relocs[FASTPATH_SIZE], *r = relocs; int i; memset(handle_tlbs, 0, sizeof(handle_tlbs)); @@ -1829,8 +1825,8 @@ static void __init build_r4000_tlb_store_handler(void) static void __init build_r4000_tlb_modify_handler(void) { u32 *p = handle_tlbm; - struct label *l = labels; - struct reloc *r = relocs; + struct label labels[FASTPATH_SIZE], *l = labels; + struct reloc relocs[FASTPATH_SIZE], *r = relocs; int i; memset(handle_tlbm, 0, sizeof(handle_tlbm)); -- 1.5.3.3