Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

vmlinux.lds: add comments for global variables and clean up useless declarations

The original goal of this patchset is to fix the bug reported by
https://bugzilla.kernel.org/show_bug.cgi?id=53501 Now it has also been
expanded to reduce common code used by memory initializion.

Patch 1-7:
1) add comments for global variables exported by vmlinux.lds
2) normalize global variables exported by vmlinux.lds
Patch 8:
Introduce helper functions mem_init_print_info() and
get_num_physpages()
Patch 9:
Avoid using global variable num_physpages at runtime
Patch 10:
Don't update num_physpages in memory_hotplug.c
Patch 11-40:
Modify arch mm initialization code to:
1) Simplify mem_init() by using mem_init_print_info()
2) Prepare for killing global variable num_physpages
Patch 41:
Kill the global variable num_physpages

With all patches applied, mem_init(), free_initmem(), free_initrd_mem()
could be as simple as below. This patch series has reduced about 1.2K
lines of code in total.

#ifndef CONFIG_DISCONTIGMEM
void __init
mem_init(void)
{
max_mapnr = max_low_pfn;
free_all_bootmem();
high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);

mem_init_print_info(NULL);
}
#endif /* CONFIG_DISCONTIGMEM */

void
free_initmem(void)
{
free_initmem_default(-1);
}

#ifdef CONFIG_BLK_DEV_INITRD
void
free_initrd_mem(unsigned long start, unsigned long end)
{
free_reserved_area(start, end, -1, "initrd");
}
#endif

Due to hardware resource limitations, I have only tested this on x86_64.
And the messages reported on an x86_64 system are:

Log message before applying patches:
Memory: 7745676k/8910848k available (6934k kernel code, 836024k absent, 329148k reserved, 6343k data, 1012k init)

Log message after applying patches:
Memory: 7744624K/8074824K available (6969K kernel code, 1011K data, 2828K rodata, 1016K init, 9640K bss, 330200K reserved)

Great thanks to Vineet Gupta for testing on ARC.

This patch:

Document global variables exported from vmlinux.lds.

1) Add comments about usage guidelines for global variables exported
from vmlinux.lds.S.
2) Remove unused __initdata_begin[] and __initdata_end[].

Signed-off-by: Jiang Liu <jiang.liu@huawei.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Vineet Gupta <vgupta@synopsys.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Jiang Liu and committed by
Linus Torvalds
1622d1ab e6c495a9

+20 -1
+20 -1
include/asm-generic/sections.h
··· 3 3 4 4 /* References to section boundaries */ 5 5 6 + /* 7 + * Usage guidelines: 8 + * _text, _data: architecture specific, don't use them in arch-independent code 9 + * [_stext, _etext]: contains .text.* sections, may also contain .rodata.* 10 + * and/or .init.* sections 11 + * [_sdata, _edata]: contains .data.* sections, may also contain .rodata.* 12 + * and/or .init.* sections. 13 + * [__start_rodata, __end_rodata]: contains .rodata.* sections 14 + * [__init_begin, __init_end]: contains .init.* sections, but .init.text.* 15 + * may be out of this range on some architectures. 16 + * [_sinittext, _einittext]: contains .init.text.* sections 17 + * [__bss_start, __bss_stop]: contains BSS sections 18 + * 19 + * Following global variables are optional and may be unavailable on some 20 + * architectures and/or kernel configurations. 21 + * _text, _data 22 + * __kprobes_text_start, __kprobes_text_end 23 + * __entry_text_start, __entry_text_end 24 + * __ctors_start, __ctors_end 25 + */ 6 26 extern char _text[], _stext[], _etext[]; 7 27 extern char _data[], _sdata[], _edata[]; 8 28 extern char __bss_start[], __bss_stop[]; ··· 32 12 extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[]; 33 13 extern char __kprobes_text_start[], __kprobes_text_end[]; 34 14 extern char __entry_text_start[], __entry_text_end[]; 35 - extern char __initdata_begin[], __initdata_end[]; 36 15 extern char __start_rodata[], __end_rodata[]; 37 16 38 17 /* Start and end of .ctors section - used for constructor calls. */