[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1] xen: add late init call in start_xen
Hello,
This patch added late_initcall to deal with some init functions which should be called after other init functions in start_xen.
If this patch is added, then the original initcall in xen will be treated as early_initcall and the late_initcall which is added by this patch will be called sequentially.
I cannot send patches through git send-email due to some security issues in my work. So intead, I just send the patches manually. Sorry for the inconvenience.
I made this patch during using xen for a project. And I want to share it and ask for review.
Boyoun Park.
From: Boyoun Park <boyoun.park@xxxxxxxxxxx> To: xen-devel@xxxxxxxxxxxxxxxxxxxx Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx> Cc: Julien Grall <julien@xxxxxxx> Cc: Bertrand Marquis <bertrand.marquis@xxxxxxx> Cc: Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: George Dunlap <george.dunlap@xxxxxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Wei Liu <wl@xxxxxxx> Cc: "Roger Pau Monné" <roger.pau@xxxxxxxxxx> Date: Tue, 15 Mar 2022 12:57:59 +0900 Subject: [PATCH v1] xen: add late init call in start_xen
This patch added late_initcall section in init.data. The late initcall would be called after initcall in the start_xen function.
Some initializing works on priority should be run in do_initcalls and other non-prioritized works would be run in do_late_initcalls.
To call some functions by late_initcall, then it is possible by using __late_initcall(/*Function Name*/);
Signed-off-by: Boyoun Park <boyoun.park@xxxxxxxxxxx> --- xen/arch/arm/setup.c | 2 ++ xen/arch/arm/xen.lds.S | 2 ++ xen/arch/x86/setup.c | 3 +++ xen/arch/x86/xen.lds.S | 2 ++ xen/common/kernel.c | 9 ++++++++- xen/include/xen/init.h | 3 +++ 6 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 85ff956..332a207 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -1063,6 +1063,8 @@ void __init start_xen(unsigned long boot_phys_offset, /* Hide UART from DOM0 if we're using it */ serial_endboot();
+ do_late_initcalls(); + if ( (rc = xsm_set_system_active()) != 0 ) panic("xsm: unable to switch to SYSTEM_ACTIVE privilege: %d\n", rc);
diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S index 1e986e2..215e2c3 100644 --- a/xen/arch/arm/xen.lds.S +++ b/xen/arch/arm/xen.lds.S @@ -163,6 +163,8 @@ SECTIONS __presmp_initcall_end = .; *(.initcall1.init) __initcall_end = .; + *(.initcalllate.init) + __late_initcall_end = .;
. = ALIGN(4); __alt_instructions = .; diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index f08b07b..d59298b 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -1952,6 +1952,8 @@ void __init noreturn __start_xen(unsigned long mbi_p)
setup_io_bitmap(dom0);
+ do_late_initcalls(); + if ( bsp_delay_spec_ctrl ) { info->spec_ctrl_flags &= ~SCF_use_shadow; @@ -1964,6 +1966,7 @@ void __init noreturn __start_xen(unsigned long mbi_p) bsp_info = get_cpu_info_from_stack((unsigned long)bsp_stack); *bsp_info = *info;
+ /* Jump to the 1:1 virtual mappings of cpu0_stack. */ asm volatile ("mov %[stk], %%rsp; jmp %c[fn]" :: [stk] "g" (&bsp_info->guest_cpu_user_regs), [fn] "i" (reinit_bsp_stack) : "memory"); diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index 8930e14..c90c7b0 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -250,6 +250,8 @@ SECTIONS __presmp_initcall_end = .; *(.initcall1.init) __initcall_end = .; + *(.initcalllate.init) + __late_initcall_end = .;
*(.init.data) *(.init.data.rel) diff --git a/xen/common/kernel.c b/xen/common/kernel.c index f8134d3..5a3d037 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -369,7 +369,7 @@ void add_taint(unsigned int flag) }
extern const initcall_t __initcall_start[], __presmp_initcall_end[], - __initcall_end[]; + __initcall_end[], __late_initcall_end[];
void __init do_presmp_initcalls(void) { @@ -385,6 +385,13 @@ void __init do_initcalls(void) (*call)(); }
+void __init do_late_initcalls(void) +{ + const initcall_t *call; + for ( call = __initcall_end; call < __late_initcall_end; call++ ) + (*call)(); +} + #ifdef CONFIG_HYPFS static unsigned int __read_mostly major_version; static unsigned int __read_mostly minor_version; diff --git a/xen/include/xen/init.h b/xen/include/xen/init.h index 0af0e23..48210ee 100644 --- a/xen/include/xen/init.h +++ b/xen/include/xen/init.h @@ -68,11 +68,14 @@ typedef void (*exitcall_t)(void); const static initcall_t __initcall_##fn __init_call("presmp") = fn #define __initcall(fn) \ const static initcall_t __initcall_##fn __init_call("1") = fn +#define __late_initcall(fn) \ + const static initcall_t __initcall_##fn __init_call("late") = fn #define __exitcall(fn) \ static exitcall_t __exitcall_##fn __exit_call = fn
void do_presmp_initcalls(void); void do_initcalls(void); +void do_late_initcalls(void);
#endif /* __ASSEMBLY__ */
-- 2.7.4
Attachment:
v1-0000-cover-letter.patch Attachment:
v1-0001-xen-add-late-init-call-in-start_xen.patch
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |