[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
Description: Binary data

Attachment: v1-0001-xen-add-late-init-call-in-start_xen.patch
Description: Binary data


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.