From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751406AbbJLIrM (ORCPT ); Mon, 12 Oct 2015 04:47:12 -0400 Received: from mail-pa0-f66.google.com ([209.85.220.66]:33576 "EHLO mail-pa0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750806AbbJLIrJ convert rfc822-to-8bit (ORCPT ); Mon, 12 Oct 2015 04:47:09 -0400 Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 9.0 \(3094\)) Subject: Re: [RFC] arm: add __initbss section attribute From: yalin wang In-Reply-To: Date: Mon, 12 Oct 2015 16:46:55 +0800 Cc: Russell King - ARM Linux , Arnd Bergmann , Will Deacon , Nicolas Pitre , Kees Cook , Catalin Marinas , Victor Kamensky , Mark Salter , vladimir.murzin@arm.com, ggdavisiv@gmail.com, paul.gortmaker@windriver.com, Ingo Molnar , Rusty Russell , "Luis R. Rodriguez" , Andrew Morton , "Kirill A. Shutemov" , n-horiguchi@ah.jp.nec.com, aarcange@redhat.com, mhocko@suse.com, jack@suse.cz, iamjoonsoo.kim@lge.com, xiexiuqi@huawei.com, Vlastimil Babka , Vineet.Gupta1@synopsys.com, "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "linux-arch@vger.kernel.org" , "linux-mm@kvack.org" Content-Transfer-Encoding: 8BIT Message-Id: References: <1444622356-8263-1-git-send-email-yalin.wang2010@gmail.com> To: Ard Biesheuvel X-Mailer: Apple Mail (2.3094) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > On Oct 12, 2015, at 16:22, Ard Biesheuvel wrote: > > On 12 October 2015 at 05:59, yalin wang 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 >> --- >> 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 >> #include >> #include >> +#include >> >> 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. yeah, I just compile it , not test it . because i need replace lots of __initdata variable to __initbss first . i don’t think zImage compression can shrink zero data in .data section , in current __initdata implementation , the zero initialized data are mixed with non-zero data, for example: int a = 20 __initdata; int b __initdata; // zero initialized data int c = 30 __initdata; so the zero data are not in a contineous memory area, compress will not benefit from this scenario, and on some platforms like arm64 , don’t compress compress zImage , i will make a test in some time later, and send out the result to see if this method is better . Thanks