ARM: smp: Pass task to secondary_start_kernel
authorKeith Packard <keithpac@amazon.com>
Sat, 18 Sep 2021 08:44:35 +0000 (10:44 +0200)
committerArd Biesheuvel <ardb@kernel.org>
Mon, 27 Sep 2021 14:54:01 +0000 (16:54 +0200)
This avoids needing to compute the task pointer in this function, which
will no longer be possible once we move thread_info off the stack.

Signed-off-by: Keith Packard <keithpac@amazon.com>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Tested-by: Amit Daniel Kachhap <amit.kachhap@arm.com>
arch/arm/include/asm/smp.h
arch/arm/kernel/head-nommu.S
arch/arm/kernel/head.S
arch/arm/kernel/smp.c

index 5d508f5..f16cbbd 100644 (file)
@@ -48,7 +48,7 @@ extern void set_smp_ipi_range(int ipi_base, int nr_ipi);
  * Called from platform specific assembly code, this is the
  * secondary CPU entry point.
  */
-asmlinkage void secondary_start_kernel(void);
+asmlinkage void secondary_start_kernel(struct task_struct *task);
 
 
 /*
@@ -61,6 +61,7 @@ struct secondary_data {
        };
        unsigned long swapper_pg_dir;
        void *stack;
+       struct task_struct *task;
 };
 extern struct secondary_data secondary_data;
 extern void secondary_startup(void);
index 0fc814b..fadfee9 100644 (file)
@@ -115,6 +115,7 @@ ENTRY(secondary_startup)
        ret     r12
 1:     bl      __after_proc_init
        ldr     sp, [r7, #12]                   @ set up the stack pointer
+       ldr     r0, [r7, #16]                   @ set up task pointer
        mov     fp, #0
        b       secondary_start_kernel
 ENDPROC(secondary_startup)
index 29070eb..fa44e2d 100644 (file)
@@ -424,8 +424,9 @@ ENDPROC(secondary_startup)
 ENDPROC(secondary_startup_arm)
 
 ENTRY(__secondary_switched)
-       ldr_l   r7, secondary_data + 12         @ get secondary_data.stack
-       mov     sp, r7
+       adr_l   r7, secondary_data + 12         @ get secondary_data.stack
+       ldr     sp, [r7]
+       ldr     r0, [r7, #4]                    @ get secondary_data.task
        mov     fp, #0
        b       secondary_start_kernel
 ENDPROC(__secondary_switched)
index 842427f..8979d54 100644 (file)
@@ -153,6 +153,7 @@ int __cpu_up(unsigned int cpu, struct task_struct *idle)
        secondary_data.pgdir = virt_to_phys(idmap_pgd);
        secondary_data.swapper_pg_dir = get_arch_pgd(swapper_pg_dir);
 #endif
+       secondary_data.task = idle;
        sync_cache_w(&secondary_data);
 
        /*
@@ -375,9 +376,12 @@ void arch_cpu_idle_dead(void)
         */
        __asm__("mov    sp, %0\n"
        "       mov     fp, #0\n"
+       "       mov     r0, %1\n"
        "       b       secondary_start_kernel"
                :
-               : "r" (task_stack_page(current) + THREAD_SIZE - 8));
+               : "r" (task_stack_page(current) + THREAD_SIZE - 8),
+                 "r" (current)
+               : "r0");
 }
 #endif /* CONFIG_HOTPLUG_CPU */
 
@@ -400,7 +404,7 @@ static void smp_store_cpu_info(unsigned int cpuid)
  * This is the secondary CPU boot entry.  We're using this CPUs
  * idle thread stack, but a set of temporary page tables.
  */
-asmlinkage void secondary_start_kernel(void)
+asmlinkage void secondary_start_kernel(struct task_struct *task)
 {
        struct mm_struct *mm = &init_mm;
        unsigned int cpu;