From: Sai Praneeth <sai.praneeth.prak...@intel.com> Invoking efi_runtime_services() through efi_rts_wq (efi runtime services workqueue) means all accesses to efi_runtime_services() should be done after efi_rts_wq has been created. efi_delete_dummy_variable() calls set_variable(), hence efi_delete_dummy_variable() should be called after efi_rts_wq has been created.
Presently, efi_delete_dummy_variable() is called from efi_enter_virtual_mode() which is early in the boot phase (efi_rts_wq isn't created yet), so call efi_delete_dummy_variable() later in the boot phase. Another and the most important reason for calling efi_delete_dummy_variable() late in the boot process is, if called before rest_init(), kernel prints stack trace with a warning "bad: scheduling from the idle thread!". Hence, call from efisubsys_init() which is called during rest_init(). Signed-off-by: Sai Praneeth Prakhya <sai.praneeth.prak...@intel.com> Suggested-by: Andy Lutomirski <l...@kernel.org> Cc: Lee Chun-Yi <j...@suse.com> Cc: Borislav Petkov <b...@alien8.de> Cc: Tony Luck <tony.l...@intel.com> Cc: Will Deacon <will.dea...@arm.com> Cc: Dave Hansen <dave.han...@intel.com> Cc: Mark Rutland <mark.rutl...@arm.com> Cc: Bhupesh Sharma <bhsha...@redhat.com> Cc: Naresh Bhat <naresh.b...@linaro.org> Cc: Ricardo Neri <ricardo.n...@intel.com> Cc: Peter Zijlstra <pet...@infradead.org> Cc: Ravi Shankar <ravi.v.shan...@intel.com> Cc: Matt Fleming <m...@codeblueprint.co.uk> Cc: Dan Williams <dan.j.willi...@intel.com> Cc: Ard Biesheuvel <ard.biesheu...@linaro.org> Cc: Miguel Ojeda <miguel.ojeda.sando...@gmail.com> --- arch/x86/include/asm/efi.h | 1 - arch/x86/platform/efi/efi.c | 6 ------ drivers/firmware/efi/efi.c | 6 ++++++ include/linux/efi.h | 3 +++ 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index cec5fae23eb3..0e61b771b93d 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h @@ -138,7 +138,6 @@ extern void __init efi_runtime_update_mappings(void); extern void __init efi_dump_pagetable(void); extern void __init efi_apply_memmap_quirks(void); extern int __init efi_reuse_config(u64 tables, int nr_tables); -extern void efi_delete_dummy_variable(void); extern void efi_switch_mm(struct mm_struct *mm); struct efi_setup_data { diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 9061babfbc83..a3169d14583f 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c @@ -893,9 +893,6 @@ static void __init kexec_enter_virtual_mode(void) if (efi_enabled(EFI_OLD_MEMMAP) && (__supported_pte_mask & _PAGE_NX)) runtime_code_page_mkexec(); - - /* clean DUMMY object */ - efi_delete_dummy_variable(); #endif } @@ -1015,9 +1012,6 @@ static void __init __efi_enter_virtual_mode(void) * necessary relocation fixups for the new virtual addresses. */ efi_runtime_update_mappings(); - - /* clean DUMMY object */ - efi_delete_dummy_variable(); } void __init efi_enter_virtual_mode(void) diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c index 232f4915223b..1176af664013 100644 --- a/drivers/firmware/efi/efi.c +++ b/drivers/firmware/efi/efi.c @@ -337,6 +337,12 @@ static int __init efisubsys_init(void) if (!efi_enabled(EFI_BOOT)) return 0; + /* + * Clean DUMMY object calls EFI Runtime Service, set_variable(), so + * it should be invoked only after efi_rts_wq is ready. + */ + efi_delete_dummy_variable(); + /* We register the efi directory at /sys/firmware/efi */ efi_kobj = kobject_create_and_add("efi", firmware_kobj); if (!efi_kobj) { diff --git a/include/linux/efi.h b/include/linux/efi.h index 3016d8c456bc..1b79939d0b1e 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -994,6 +994,7 @@ extern efi_status_t efi_query_variable_store(u32 attributes, unsigned long size, bool nonblocking); extern void efi_find_mirror(void); +extern void efi_delete_dummy_variable(void); #else static inline void efi_late_init(void) {} static inline void efi_free_boot_services(void) {} @@ -1004,6 +1005,8 @@ static inline efi_status_t efi_query_variable_store(u32 attributes, { return EFI_SUCCESS; } + +static inline void efi_delete_dummy_variable(void) {} #endif extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr); -- 2.7.4