On 12/12/13 at 09:53pm, Borislav Petkov wrote: > On Thu, Dec 12, 2013 at 10:36:17AM +0800, Dave Young wrote: > > Sorry that I forgot to explain this in changelog, should ask you before. > > > > I did try moving it to efisubsys_init but it need add extern declaration > > So what? Add it. > > > for efi_runtime_map_init. Since link order will ensure it being called after > > efisubsys_init I think it's fine with this static function. > > This is actually exactly the reason why it shouldn't be another > subsys_initcall() if it can be helped. People would need to go have a > look at drivers/firmware/efi/Makefile to realize that the link order is > ok. > > And, this is prone to future breakage if people go and move code around > and thereby change the link order. > > Please call efi_runtime_map_init from efisubsys_init. After moving to efisubsys_init, the code will looks like below, because the funtion only is used in drivers/firmware/efi/efi.c thus I can not add a blank function in #else section in the efi.h header file. Creating another header file for this one function looks bad to me. Is below changes fine to you? I can add it to next version if you like it. diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index 9fbaeb2..2db7ea5 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h @@ -133,6 +133,10 @@ extern void efi_sync_low_kernel_mappings(void); extern void efi_setup_page_tables(void); extern void __init old_map_region(efi_memory_desc_t *md); +#ifdef CONFIG_EFI_RUNTIME_MAP +extern int __init efi_runtime_map_init(void); +#endif + #ifdef CONFIG_EFI static inline bool efi_is_native(void) diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c index afd0b49..85fd904 100644 --- a/drivers/firmware/efi/efi.c +++ b/drivers/firmware/efi/efi.c @@ -168,6 +168,12 @@ static int __init efisubsys_init(void) goto err_unregister; } +#ifdef CONFIG_EFI_RUNTIME_MAP + error = efi_runtime_map_init(); + if (error) + goto err_remove_group; +#endif + /* and the standard mountpoint for efivarfs */ efivars_kobj = kobject_create_and_add("efivars", efi_kobj); if (!efivars_kobj) { diff --git a/drivers/firmware/efi/runtime-map.c b/drivers/firmware/efi/runtime-map.c index e5e9984..5af06ad 100644 --- a/drivers/firmware/efi/runtime-map.c +++ b/drivers/firmware/efi/runtime-map.c @@ -135,7 +135,7 @@ static struct efi_runtime_map_entry *add_sysfs_runtime_map_entry(int nr) return entry; } -static int __init efi_runtime_map_init(void) +int __init efi_runtime_map_init(void) { int i, j, ret = 0; struct efi_runtime_map_entry *entry; @@ -172,5 +172,3 @@ out_add_entry: out: return ret; } - -subsys_initcall(efi_runtime_map_init); -- Thanks Dave