Re: [RFC] arm: add __initbss section attribute

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12 October 2015 at 05:59, yalin wang <yalin.wang2010@xxxxxxxxx> wrote:
> This attribute can make init data to be into .initbss section,
> this will make the data to be NO_BITS in vmlinux, can shrink the
> Image file size, and speed up the boot up time.
>
> Signed-off-by: yalin wang <yalin.wang2010@xxxxxxxxx>
> ---
>  arch/arm/kernel/vmlinux.lds.S     |  2 +-
>  arch/arm/mm/init.c                |  1 +
>  include/asm-generic/sections.h    |  1 +
>  include/asm-generic/vmlinux.lds.h | 11 ++++++++++-
>  include/linux/init.h              |  1 +
>  include/linux/mm.h                |  4 +++-
>  6 files changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
> index 8b60fde..ad6d740 100644
> --- a/arch/arm/kernel/vmlinux.lds.S
> +++ b/arch/arm/kernel/vmlinux.lds.S
> @@ -330,7 +330,7 @@ SECTIONS
>         }
>  #endif
>
> -       BSS_SECTION(0, 0, 0)
> +       BSS_SECTION(0, 0, 0, 0)
>         _end = .;
>
>         STABS_DEBUG
> diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
> index 8a63b4c..50b881e 100644
> --- a/arch/arm/mm/init.c
> +++ b/arch/arm/mm/init.c
> @@ -722,6 +722,7 @@ void free_initmem(void)
>         free_tcmmem();
>
>         poison_init_mem(__init_begin, __init_end - __init_begin);
> +       poison_init_mem(__initbss_start, __initbss_start - __initbss_end);
>         if (!machine_is_integrator() && !machine_is_cintegrator())
>                 free_initmem_default(-1);
>  }
> diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
> index b58fd66..a63ebe9 100644
> --- a/include/asm-generic/sections.h
> +++ b/include/asm-generic/sections.h
> @@ -29,6 +29,7 @@ extern char _text[], _stext[], _etext[];
>  extern char _data[], _sdata[], _edata[];
>  extern char __bss_start[], __bss_stop[];
>  extern char __init_begin[], __init_end[];
> +extern char __initbss_start[], __initbss_end[];
>  extern char _sinittext[], _einittext[];
>  extern char _end[];
>  extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[];
> diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
> index c4bd0e2..b3db62d 100644
> --- a/include/asm-generic/vmlinux.lds.h
> +++ b/include/asm-generic/vmlinux.lds.h
> @@ -574,6 +574,14 @@
>                 *(COMMON)                                               \
>         }
>
> +#define INITBSS(initbss_align)                                         \
> +       . = ALIGN(initbss_align);                                       \
> +       .initbss : AT(ADDR(.initbss) - LOAD_OFFSET) {                   \
> +               VMLINUX_SYMBOL(__initbss_start) = .;                    \
> +               *(.bss.init.data)                                       \
> +               VMLINUX_SYMBOL(__initbss_end) = .;                      \
> +       }
> +
>  /*
>   * DWARF debug sections.
>   * Symbols in the DWARF debugging sections are relative to
> @@ -831,10 +839,11 @@
>                 INIT_RAM_FS                                             \
>         }
>
> -#define BSS_SECTION(sbss_align, bss_align, stop_align)                 \
> +#define BSS_SECTION(sbss_align, bss_align, initbss_align, stop_align)                  \
>         . = ALIGN(sbss_align);                                          \
>         VMLINUX_SYMBOL(__bss_start) = .;                                \
>         SBSS(sbss_align)                                                \
>         BSS(bss_align)                                                  \
> +       INITBSS(initbss_align)                                          \
>         . = ALIGN(stop_align);                                          \
>         VMLINUX_SYMBOL(__bss_stop) = .;
> diff --git a/include/linux/init.h b/include/linux/init.h
> index b449f37..f2960b2 100644
> --- a/include/linux/init.h
> +++ b/include/linux/init.h
> @@ -41,6 +41,7 @@
>     discard it in modules) */
>  #define __init         __section(.init.text) __cold notrace
>  #define __initdata     __section(.init.data)
> +#define __initbss      __section(.bss.init.data)

Shouldn't this be .init.bss ?

>  #define __initconst    __constsection(.init.rodata)
>  #define __exitdata     __section(.exit.data)
>  #define __exit_call    __used __section(.exitcall.exit)
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index d30eea3..1f266f7 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -21,6 +21,7 @@
>  #include <linux/resource.h>
>  #include <linux/page_ext.h>
>  #include <linux/err.h>
> +#include <asm/sections.h>
>
>  struct mempolicy;
>  struct anon_vma;
> @@ -1722,10 +1723,11 @@ static inline void mark_page_reserved(struct page *page)
>   */
>  static inline unsigned long free_initmem_default(int poison)
>  {
> -       extern char __init_begin[], __init_end[];
>
>         return free_reserved_area(&__init_begin, &__init_end,
>                                   poison, "unused kernel");
> +       return free_reserved_area(&__initbss_start, &__initbss_end,
> +                                 poison, "unused kernel");

You obviously have not tested this code, since the first return makes
the second unreachable.

So you will need to put __initbss annotations all over the tree to
actually populate and then free this section (after you have fixed
your code). Before we do that, could we have an estimate of how much
memory it actually frees up, especially since the zImage compression
should ensure that zero initialized PROGBITS .data does not take very
much additional space in the first place.

-- 
Ard.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@xxxxxxxxx.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@xxxxxxxxx";> email@xxxxxxxxx </a>



[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]