* [PATCH 1/2] x86 : add init BSS sections
@ 2008-02-21 8:15 Huang, Ying
2008-02-21 9:52 ` Sam Ravnborg
0 siblings, 1 reply; 2+ messages in thread
From: Huang, Ying @ 2008-02-21 8:15 UTC (permalink / raw)
To: Ingo Molnar, H. Peter Anvin, Thomas Gleixner, Andi Kleen,
Ian Campbell, Matt Mackall
Cc: linux-kernel
Init BSS sections are added for uninitialized init DATA sections to
reduce kernel image size.
Signed-off-by: Huang Ying <ying.huang@intel.com>
---
arch/x86/kernel/head64.c | 2 ++
arch/x86/kernel/head_32.S | 5 +++++
arch/x86/kernel/vmlinux_32.lds.S | 9 +++++++--
arch/x86/kernel/vmlinux_64.lds.S | 24 ++++++++++++++----------
include/asm-generic/sections.h | 1 +
include/linux/init.h | 1 +
6 files changed, 30 insertions(+), 12 deletions(-)
--- a/arch/x86/kernel/vmlinux_32.lds.S
+++ b/arch/x86/kernel/vmlinux_32.lds.S
@@ -189,10 +189,15 @@ SECTIONS
__per_cpu_end = .;
}
. = ALIGN(PAGE_SIZE);
- /* freed after init ends here */
.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
- __init_end = .;
+ __init_bss_start = .;
+ *(.bss.init.page_aligned)
+ *(.bss.init)
+ . = ALIGN(4);
+ __init_bss_stop = .;
+ . = ALIGN(PAGE_SIZE);
+ __init_end = .; /* freed after init ends here */
__bss_start = .; /* BSS */
*(.bss.page_aligned)
*(.bss)
--- a/arch/x86/kernel/vmlinux_64.lds.S
+++ b/arch/x86/kernel/vmlinux_64.lds.S
@@ -150,6 +150,12 @@ SECTIONS
. = ALIGN(PAGE_SIZE);
__smp_alt_end = .;
+ . = ALIGN(PAGE_SIZE);
+ __nosave_begin = .;
+ .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { *(.data.nosave) }
+ . = ALIGN(PAGE_SIZE);
+ __nosave_end = .;
+
. = ALIGN(PAGE_SIZE); /* Init code and data */
__init_begin = .;
.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
@@ -219,17 +225,15 @@ SECTIONS
PERCPU(PAGE_SIZE)
- . = ALIGN(PAGE_SIZE);
- __init_end = .;
-
- . = ALIGN(PAGE_SIZE);
- __nosave_begin = .;
- .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { *(.data.nosave) }
- . = ALIGN(PAGE_SIZE);
- __nosave_end = .;
-
- __bss_start = .; /* BSS */
+ . = ALIGN(PAGE_SIZE); /* BSS */
.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
+ __init_bss_start = .;
+ *(.bss.init.page_aligned)
+ *(.bss.init)
+ __init_bss_stop = .;
+ . = ALIGN(PAGE_SIZE);
+ __init_end = .;
+ __bss_start = .;
*(.bss.page_aligned)
*(.bss)
}
--- a/arch/x86/kernel/head_32.S
+++ b/arch/x86/kernel/head_32.S
@@ -105,6 +105,11 @@ ENTRY(startup_32)
*/
cld
xorl %eax,%eax
+ movl $pa(__init_bss_start),%edi
+ movl $pa(__init_bss_stop), %ecx
+ subl %edi,%ecx
+ shrl $2,%ecx
+ rep ; stosl
movl $pa(__bss_start),%edi
movl $pa(__bss_stop),%ecx
subl %edi,%ecx
--- a/include/asm-generic/sections.h
+++ b/include/asm-generic/sections.h
@@ -5,6 +5,7 @@
extern char _text[], _stext[], _etext[];
extern char _data[], _sdata[], _edata[];
+extern char __init_bss_start[], __init_bss_stop[];
extern char __bss_start[], __bss_stop[];
extern char __init_begin[], __init_end[];
extern char _sinittext[], _einittext[];
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -34,6 +34,8 @@ static void __init zap_identity_mappings
yet. */
static void __init clear_bss(void)
{
+ memset(__init_bss_start, 0, (unsigned long) __init_bss_stop -
+ (unsigned long) __init_bss_start);
memset(__bss_start, 0,
(unsigned long) __bss_stop - (unsigned long) __bss_start);
}
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -43,6 +43,7 @@
#define __init __section(.init.text) __cold
#define __initdata __section(.init.data)
#define __initconst __section(.init.rodata)
+#define __initbss __section(.bss.init)
#define __exitdata __section(.exit.data)
#define __exit_call __used __section(.exitcall.exit)
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [PATCH 1/2] x86 : add init BSS sections
2008-02-21 8:15 [PATCH 1/2] x86 : add init BSS sections Huang, Ying
@ 2008-02-21 9:52 ` Sam Ravnborg
0 siblings, 0 replies; 2+ messages in thread
From: Sam Ravnborg @ 2008-02-21 9:52 UTC (permalink / raw)
To: Huang, Ying
Cc: Ingo Molnar, H. Peter Anvin, Thomas Gleixner, Andi Kleen,
Ian Campbell, Matt Mackall, linux-kernel
Hi Huang.
A few comments..
> Init BSS sections are added for uninitialized init DATA sections to
> reduce kernel image size.
- If this is relevant for more than just x86 then the definition
of the section should be in include/asm-generic/vmlinux.lds.h
- Please add a comment along the definitions in the .lds file
explaning the use of the section.
- Same goes for init.h
- Is this concept restricted to __init or is it
relevant for __devinit etc (I hope we can avoid that)
- Can we do any kind of build time check to catch
accidental misuse?
Sam
>
> Signed-off-by: Huang Ying <ying.huang@intel.com>
>
> ---
> arch/x86/kernel/head64.c | 2 ++
> arch/x86/kernel/head_32.S | 5 +++++
> arch/x86/kernel/vmlinux_32.lds.S | 9 +++++++--
> arch/x86/kernel/vmlinux_64.lds.S | 24 ++++++++++++++----------
> include/asm-generic/sections.h | 1 +
> include/linux/init.h | 1 +
> 6 files changed, 30 insertions(+), 12 deletions(-)
>
> --- a/arch/x86/kernel/vmlinux_32.lds.S
> +++ b/arch/x86/kernel/vmlinux_32.lds.S
> @@ -189,10 +189,15 @@ SECTIONS
> __per_cpu_end = .;
> }
> . = ALIGN(PAGE_SIZE);
Do we really need to aling this to PAGE_SIZE - I
assume we free everything in one go - or?
> - /* freed after init ends here */
>
> .bss : AT(ADDR(.bss) - LOAD_OFFSET) {
> - __init_end = .;
> + __init_bss_start = .;
> + *(.bss.init.page_aligned)
I do not see this section used anywhere. At least init.h does not
define it.
> + *(.bss.init)
> + . = ALIGN(4);
> + __init_bss_stop = .;
> + . = ALIGN(PAGE_SIZE);
Why do we have these two ALIGN() following each other?
The latter should be enough.
> + __init_end = .; /* freed after init ends here */
> __bss_start = .; /* BSS */
> *(.bss.page_aligned)
> *(.bss)
> --- a/arch/x86/kernel/vmlinux_64.lds.S
> +++ b/arch/x86/kernel/vmlinux_64.lds.S
> @@ -150,6 +150,12 @@ SECTIONS
> . = ALIGN(PAGE_SIZE);
> __smp_alt_end = .;
>
> + . = ALIGN(PAGE_SIZE);
> + __nosave_begin = .;
> + .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { *(.data.nosave) }
> + . = ALIGN(PAGE_SIZE);
> + __nosave_end = .;
> +
This change looks unrelated - it is not in the changelog.
Or is it just diff that fools me?
> . = ALIGN(PAGE_SIZE); /* Init code and data */
> __init_begin = .;
> .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
> @@ -219,17 +225,15 @@ SECTIONS
>
> PERCPU(PAGE_SIZE)
>
> - . = ALIGN(PAGE_SIZE);
> - __init_end = .;
> -
> - . = ALIGN(PAGE_SIZE);
> - __nosave_begin = .;
> - .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { *(.data.nosave) }
> - . = ALIGN(PAGE_SIZE);
> - __nosave_end = .;
> -
> - __bss_start = .; /* BSS */
> + . = ALIGN(PAGE_SIZE); /* BSS */
> .bss : AT(ADDR(.bss) - LOAD_OFFSET) {
> + __init_bss_start = .;
> + *(.bss.init.page_aligned)
> + *(.bss.init)
> + __init_bss_stop = .;
> + . = ALIGN(PAGE_SIZE);
> + __init_end = .;
> + __bss_start = .;
> *(.bss.page_aligned)
> *(.bss)
> }
> --- a/arch/x86/kernel/head_32.S
> +++ b/arch/x86/kernel/head_32.S
> @@ -105,6 +105,11 @@ ENTRY(startup_32)
> */
> cld
> xorl %eax,%eax
> + movl $pa(__init_bss_start),%edi
> + movl $pa(__init_bss_stop), %ecx
> + subl %edi,%ecx
> + shrl $2,%ecx
> + rep ; stosl
> movl $pa(__bss_start),%edi
> movl $pa(__bss_stop),%ecx
> subl %edi,%ecx
How about introducing head32.c and do this in a similar
way that 64 bit does?
Then we could later move more stuff to said file.
Sam
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-02-21 9:52 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-02-21 8:15 [PATCH 1/2] x86 : add init BSS sections Huang, Ying
2008-02-21 9:52 ` Sam Ravnborg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®