• J
    ftrace: __start_mcount_loc should be .init.rodata · 4b3b4c5e
    John Reiser 提交于
    __start_mcount_loc[] is unused after init, yet occupies RAM forever
    as part of .rodata.  152kiB is typical on a 64-bit architecture.  Instead,
    __start_mcount_loc should be in the interval [__init_begin, __init_end)
    so that the space is reclaimed after init.
    
    __start_mcount_loc[] is generated during the load portion
    of kernel build, and is used only by ftrace_init().  ftrace_init is declared
    '__init' and is in .init.text, which is freed after init.
    __start_mcount_loc is placed into .rodata by a call to MCOUNT_REC inside
    the RO_DATA macro of include/asm-generic/vmlinux.lds.h.  The array *is*
    read-only, but more importantly it is not used after init.  So the call to
    MCOUNT_REC should be moved from RO_DATA to INIT_DATA.
    
    This patch has been tested on x86_64 with CONFIG_DEBUG_PAGEALLOC=y
    which verifies that the address range never is accessed after init.
    Signed-off-by: NJohn Reiser <jreiser@BitWagon.com>
    LKML-Reference: <4A6DF0B6.7080402@bitwagon.com>
    Signed-off-by: NSteven Rostedt <rostedt@goodmis.org>
    4b3b4c5e
vmlinux.lds.h 21.4 KB