lguest: clean up some l"references .init.text" warnings
Subsystems (2)
PATCH 1/1 lguest: clean up some l"references .init.text" warnings
Thanks to Andrew for pointing these out.
This patch moves the parvirtprobe section into .init.data: it's only used in very very early boot, and for similar reasons, puts lguest_maybe_init and lguest_memory_setup in init.text.
As well as fixing some warnings, this frees up a tiny bit more memory.
arch/i386/kernel/vmlinux.lds.S +6 -7
@@ -81,12 +81,6 @@ SECTIONS CONSTRUCTORS } :data - .paravirtprobe : AT(ADDR(.paravirtprobe) - LOAD_OFFSET) { - __start_paravirtprobe = .; - *(.paravirtprobe) - __stop_paravirtprobe = .; - } - . = ALIGN(4096); .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { __nosave_begin = .;
@@ -151,7 +145,12 @@ SECTIONS *(.init.text) _einittext = .; } - .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) } + .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { + *(.init.data) + __start_paravirtprobe = .; + *(.paravirtprobe) + __stop_paravirtprobe = .; + } . = ALIGN(16); .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { __setup_start = .;
arch/i386/lguest/lguest.c +3 -2
@@ -136,7 +136,7 @@ static struct notifier_block paniced = { .notifier_call = lguest_panic }; -static char *lguest_memory_setup (void ) +static __init char *lguest_memory_setup (void ) {/* We do this here because lockcheck barfs if before start_kernel */ atomic_notifier_chain_register (&panic_notifier_list, &paniced);
@@ -549,7 +549,8 @@ static __attribute_used__ __init void lgstart_kernel (); } -asm("lguest_maybe_init:\n" +asm(".section .init.text\n" +"lguest_maybe_init:\n" " cmpl $"__stringify(LGUEST_MAGIC_EBP)", %ebp\n"" jne 1f\n" " cmpl $"__stringify(LGUEST_MAGIC_EDI)", %edi\n"
PATCH 1/1 lguest: clean rest of linkage warnings (bar one)
My previous warning fix broke lguest if your text size wasn't correct to make the __start_paravirtprobe aligned correctly. Put the separate paravirtprobe section back, but inside the init section so it gets discarded.
It also fixes the remaining warnings, except one. The code in modpost.c which needs to be taught that it's legal to link from .paravirtprobe to .init.text is horrible, and I'm pretty sure I'd just make it worse.
arch/i386/kernel/vmlinux.lds.S +6 -6
@@ -145,12 +145,7 @@ SECTIONS *(.init.text) _einittext = .; } - .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { - *(.init.data) - __start_paravirtprobe = .; - *(.paravirtprobe) - __stop_paravirtprobe = .; - } + .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) } . = ALIGN(16); .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { __setup_start = .;
@@ -178,6 +173,11 @@ SECTIONS *(.altinstr_replacement) } . = ALIGN(4); + .paravirtprobe : AT(ADDR(.paravirtprobe) - LOAD_OFFSET) { + __start_paravirtprobe = .; + *(.paravirtprobe) + __stop_paravirtprobe = .; + } .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) { __start_parainstructions = .; *(.parainstructions)
arch/i386/lguest/core.c +1 -1
@@ -131,7 +131,7 @@ free_some_pages:return err; } -static __exit void unmap_hypervisor(void) +static void unmap_hypervisor (void ) {unsigned int i;
arch/i386/lguest/lg.h +1 -1
@@ -38,7 +38,7 @@ struct lguest_regsu32 ss; }; -__exit void free_pagetables(void); +void free_pagetables (void );__init int init_pagetables (struct page **hype_page,int pages);/* Full 4G segment descriptors, suitable for CS and DS. */
arch/i386/lguest/lguest.c +3 -2
@@ -550,7 +550,7 @@ static __attribute_used__ __init void lgstart_kernel (); } -asm(".section .init.text\n" +asm(".pushsection .init.text,\"ax\",@progbits\n" "lguest_maybe_init:\n" " cmpl $"__stringify(LGUEST_MAGIC_EBP)", %ebp\n"" jne 1f\n"
@@ -558,6 +558,7 @@ asm(".section .init.text\n"" jne 1f\n" " cmpl $"__stringify(LGUEST_MAGIC_ESI)", %esi\n"" je lguest_init\n" - "1: ret"); +"1: ret\n" + ".popsection"); extern void asmlinkage lguest_maybe_init(void);paravirt_probe (lguest_maybe_init);
arch/i386/lguest/page_tables.c +1 -1
@@ -381,7 +381,7 @@ __init int init_pagetables(struct page *return 0 ; } -__exit void free_pagetables(void) +void free_pagetables (void ) {free_hypervisor_pte_pages (); }
Re: [PATCH] lguest: clean rest of linkage warnings (bar one)
Quoted 9 lines · Rusty Russell
My previous warning fix broke lguest if your text size wasn't correct to make the
__start_paravirtprobealigned correctly. Put the separate paravirtprobe section back, but inside the init section so it gets discarded.It also fixes the remaining warnings, except one. The code in
modpost.cwhich needs to be taught that it's legal to link from .paravirtprobe to .init.text is horrible, and I'm pretty sure I'd just make it worse.
If you drop me a sample of the exact warning I will add this one too. Current kbuild.git contains a lot of fixes in this area so I refer to do so on top of that tree.
Sam
Re: [PATCH] lguest: clean rest of linkage warnings (bar one)
Quoted 9 lines · Sam Ravnborg
Quoted 4 lines · Rusty Russell
It also fixes the remaining warnings, except one. The code in
modpost.cwhich needs to be taught that it's legal to link from .paravirtprobe to .init.text is horrible, and I'm pretty sure I'd just make it worse.If you drop me a sample of the exact warning I will add this one too. Current kbuild.git contains a lot of fixes in this area so I refer to do so on top of that tree.
WARNING: vmlinux - Section mismatch: reference to .init.text: from .paravirtprobe between '__start_paravirtprobe' (at offset 0xc0464c7c) and '__stop_paravirtprobe'
Sam, you're always so polite and damn helpful: I'm pretty sure that violates the core tenets of Linux etiquette.
Perhaps you could work on that?
Rusty.
Re: [PATCH] lguest: clean rest of linkage warnings (bar one)
Quoted 7 lines · Rusty Russell
Quoted 6 lines · Sam Ravnborg
Quoted 4 lines · Rusty Russell
It also fixes the remaining warnings, except one. The code in
modpost.cwhich needs to be taught that it's legal to link from .paravirtprobe to .init.text is horrible, and I'm pretty sure I'd just make it worse.
Quoted 8 lines
Quoted 3 lines
If you drop me a sample of the exact warning I will add this one too. Current kbuild.git contains a lot of fixes in this area so I refer to do so on top of that tree.
WARNING: vmlinux - Section mismatch: reference to .init.text: from .paravirtprobe between '
__start_paravirtprobe' (at offset0xc0464c7c) and '__stop_paravirtprobe'Sam, you're always so polite and damn helpful: I'm pretty sure that violates the core tenets of Linux etiquette.
I get this strange feeling that you are planning to ask me to do much more....
Anyway I have added following path to kbuild.git.
Two small unrelated changes sneaked in (deleting a wrong part of a comment and adding an empty line)
It should apply on top of latest -mm
Sam
scripts/mod/modpost.c +14 -1
@@ -626,7 +626,6 @@ static int strrcmp(const char *s, const char *sub)* tosec = .init.text * fromsec = .text * atsym = kernel_init -* Some symbols belong to init section but still it is ok to reference * * Pattern 7: * Logos used in drivers/video/logo reside in __initdata but the
@@ -643,6 +642,13 @@ static int strrcmp(const char *s, const char *sub)* The pattern is: * tosec = .init.text * fromsec = __ksymtab* +* +* Pattern 9: +* Symbols contained in .paravirtprobe amy safely reference +* .init.text. +* The pattern is: +* tosec = .init.text +* fromsec = .paravirtprobe **/ static int secref_whitelist(const char *modname, const char *tosec, const char *fromsec, const char *atsym,
@@ -720,10 +726,17 @@ static int secref_whitelist(const char *modname, const char *tosec, (strncmp(fromsec, ".text", strlen(".text")) == 0) && (strncmp(refsymname, "logo_", strlen("logo_")) == 0))return 1 ; +/* Check for pattern 8 */ if ((strcmp (tosec,".init.text" ) ==0 ) && (strncmp (fromsec,"__ksymtab" ,strlen ("__ksymtab" )) ==0 ))return 1 ; + +/* Check for pattern 9 */ +if ((strcmp (tosec,".init.text" ) ==0 ) && + (strcmp (fromsec,".paravirtprobe" ) ==0 )) +return 1 ; +return 0 ; }