From: Keith Packard <keithp@keithp.com> To: linux-kernel@vger.kernel.org Cc: "Abbott Liu" <liuwenliang@huawei.com>, "Alexander Sverdlin" <alexander.sverdlin@gmail.com>, "Andrew Morton" <akpm@linux-foundation.org>, "Anshuman Khandual" <anshuman.khandual@arm.com>, "Ard Biesheuvel" <ardb@kernel.org>, "Arnd Bergmann" <arnd@arndb.de>, "Bjorn Andersson" <bjorn.andersson@linaro.org>, "Florian Fainelli" <f.fainelli@gmail.com>, "Geert Uytterhoeven" <geert+renesas@glider.be>, "Hartley Sweeten" <hsweeten@visionengravers.com>, "Jens Axboe" <axboe@kernel.dk>, "Jian Cai" <jiancai@google.com>, "Joe Perches" <joe@perches.com>, "Kees Cook" <keescook@chromium.org>, "Keith Packard" <keithp@keithp.com>, "Krzysztof Kozlowski" <krzysztof.kozlowski@canonical.com>, "Linus Walleij" <linus.walleij@linaro.org>, linux-arm-kernel@lists.infradead.org, "Manivannan Sadhasivam" <mani@kernel.org>, "Marc Zyngier" <maz@kernel.org>, "Masahiro Yamada" <masahiroy@kernel.org>, "Miguel Ojeda" <ojeda@kernel.org>, "Mike Rapoport" <rppt@kernel.org>, "Nathan Chancellor" <nathan@kernel.org>, "Nick Desaulniers" <ndesaulniers@google.com>, "Nicolas Pitre" <nico@fluxnic.net>, "Rob Herring" <robh@kernel.org>, "Russell King" <linux@armlinux.org.uk>, "Thomas Gleixner" <tglx@linutronix.de>, "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>, "Valentin Schneider" <valentin.schneider@arm.com>, "Viresh Kumar" <viresh.kumar@linaro.org>, "Wolfram Sang (Renesas)" <wsa+renesas@sang-engineering.com>, "YiFei Zhu" <yifeifz2@illinois.edu>, "Keith Packard" <keithpac@amazon.com> Subject: [PATCH 1/3] ARM: Pass cpu number to secondary_start_kernel Date: Fri, 3 Sep 2021 23:09:06 -0700 [thread overview] Message-ID: <20210904060908.1310204-2-keithp@keithp.com> (raw) In-Reply-To: <20210904060908.1310204-1-keithp@keithp.com> Instead of pulling the CPU value out of the thread_info struct, pass it as an argument. When first initializing secondary processors, this is done by stashing the value in the secondary_data struct. When restarting idle processors, the previous CPU value is passed. Because the cpu is now known at the top of secondary_start_kernel, the per_cpu_offset value can now be set at this point, instead of in cpu_init where it was also incorrectly setting the per_cpu_offset for the boot processor before that value had been computed. Signed-off-by: Keith Packard <keithpac@amazon.com> --- arch/arm/include/asm/smp.h | 3 ++- arch/arm/kernel/head-nommu.S | 1 + arch/arm/kernel/head.S | 1 + arch/arm/kernel/setup.c | 6 ------ arch/arm/kernel/smp.c | 14 +++++++++----- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h index 5d508f5d56c4..86a7fd721556 100644 --- a/arch/arm/include/asm/smp.h +++ b/arch/arm/include/asm/smp.h @@ -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(unsigned int cpu); /* @@ -61,6 +61,7 @@ struct secondary_data { }; unsigned long swapper_pg_dir; void *stack; + unsigned int cpu; }; extern struct secondary_data secondary_data; extern void secondary_startup(void); diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S index 0fc814bbc34b..5aa8ef42717f 100644 --- a/arch/arm/kernel/head-nommu.S +++ b/arch/arm/kernel/head-nommu.S @@ -114,6 +114,7 @@ ENTRY(secondary_startup) add r12, r12, r10 ret r12 1: bl __after_proc_init + ldr r0, [r7, #16] @ set up cpu number ldr sp, [r7, #12] @ set up the stack pointer mov fp, #0 b secondary_start_kernel diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 7f62c5eccdf3..0e541af738e2 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S @@ -394,6 +394,7 @@ ENDPROC(secondary_startup_arm) ENTRY(__secondary_switched) ldr_l r7, secondary_data + 12 @ get secondary_data.stack + ldr_l r0, secondary_data + 16 @ get secondary_data.cpu mov sp, r7 mov fp, #0 b secondary_start_kernel diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 73ca7797b92f..ca0201635fac 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -532,12 +532,6 @@ void notrace cpu_init(void) BUG(); } - /* - * This only works on resume and secondary cores. For booting on the - * boot cpu, smp_prepare_boot_cpu is called after percpu area setup. - */ - set_my_cpu_offset(per_cpu_offset(cpu)); - cpu_proc_init(); /* diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 74679240a9d8..55cb1689a4b3 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -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.cpu = cpu; sync_cache_w(&secondary_data); /* @@ -373,11 +374,14 @@ void arch_cpu_idle_dead(void) * cpu initialisation. There's some initialisation which needs * to be repeated to undo the effects of taking the CPU offline. */ - __asm__("mov sp, %0\n" + __asm__("mov r0, %1\n" + " mov sp, %0\n" " mov fp, #0\n" " b secondary_start_kernel" : - : "r" (task_stack_page(current) + THREAD_SIZE - 8)); + : "r" (task_stack_page(current) + THREAD_SIZE - 8), + "r" (cpu) + : "r0"); } #endif /* CONFIG_HOTPLUG_CPU */ @@ -400,10 +404,11 @@ 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(unsigned int cpu) { struct mm_struct *mm = &init_mm; - unsigned int cpu; + + set_my_cpu_offset(per_cpu_offset(cpu)); secondary_biglittle_init(); @@ -420,7 +425,6 @@ asmlinkage void secondary_start_kernel(void) * All kernel threads share the same mm context; grab a * reference and switch to it. */ - cpu = smp_processor_id(); mmgrab(mm); current->active_mm = mm; cpumask_set_cpu(cpu, mm_cpumask(mm)); -- 2.33.0
WARNING: multiple messages have this Message-ID (diff)
From: Keith Packard <keithp@keithp.com> To: linux-kernel@vger.kernel.org Cc: "Abbott Liu" <liuwenliang@huawei.com>, "Alexander Sverdlin" <alexander.sverdlin@gmail.com>, "Andrew Morton" <akpm@linux-foundation.org>, "Anshuman Khandual" <anshuman.khandual@arm.com>, "Ard Biesheuvel" <ardb@kernel.org>, "Arnd Bergmann" <arnd@arndb.de>, "Bjorn Andersson" <bjorn.andersson@linaro.org>, "Florian Fainelli" <f.fainelli@gmail.com>, "Geert Uytterhoeven" <geert+renesas@glider.be>, "Hartley Sweeten" <hsweeten@visionengravers.com>, "Jens Axboe" <axboe@kernel.dk>, "Jian Cai" <jiancai@google.com>, "Joe Perches" <joe@perches.com>, "Kees Cook" <keescook@chromium.org>, "Keith Packard" <keithp@keithp.com>, "Krzysztof Kozlowski" <krzysztof.kozlowski@canonical.com>, "Linus Walleij" <linus.walleij@linaro.org>, linux-arm-kernel@lists.infradead.org, "Manivannan Sadhasivam" <mani@kernel.org>, "Marc Zyngier" <maz@kernel.org>, "Masahiro Yamada" <masahiroy@kernel.org>, "Miguel Ojeda" <ojeda@kernel.org>, "Mike Rapoport" <rppt@kernel.org>, "Nathan Chancellor" <nathan@kernel.org>, "Nick Desaulniers" <ndesaulniers@google.com>, "Nicolas Pitre" <nico@fluxnic.net>, "Rob Herring" <robh@kernel.org>, "Russell King" <linux@armlinux.org.uk>, "Thomas Gleixner" <tglx@linutronix.de>, "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>, "Valentin Schneider" <valentin.schneider@arm.com>, "Viresh Kumar" <viresh.kumar@linaro.org>, "Wolfram Sang (Renesas)" <wsa+renesas@sang-engineering.com>, "YiFei Zhu" <yifeifz2@illinois.edu>, "Keith Packard" <keithpac@amazon.com> Subject: [PATCH 1/3] ARM: Pass cpu number to secondary_start_kernel Date: Fri, 3 Sep 2021 23:09:06 -0700 [thread overview] Message-ID: <20210904060908.1310204-2-keithp@keithp.com> (raw) In-Reply-To: <20210904060908.1310204-1-keithp@keithp.com> Instead of pulling the CPU value out of the thread_info struct, pass it as an argument. When first initializing secondary processors, this is done by stashing the value in the secondary_data struct. When restarting idle processors, the previous CPU value is passed. Because the cpu is now known at the top of secondary_start_kernel, the per_cpu_offset value can now be set at this point, instead of in cpu_init where it was also incorrectly setting the per_cpu_offset for the boot processor before that value had been computed. Signed-off-by: Keith Packard <keithpac@amazon.com> --- arch/arm/include/asm/smp.h | 3 ++- arch/arm/kernel/head-nommu.S | 1 + arch/arm/kernel/head.S | 1 + arch/arm/kernel/setup.c | 6 ------ arch/arm/kernel/smp.c | 14 +++++++++----- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h index 5d508f5d56c4..86a7fd721556 100644 --- a/arch/arm/include/asm/smp.h +++ b/arch/arm/include/asm/smp.h @@ -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(unsigned int cpu); /* @@ -61,6 +61,7 @@ struct secondary_data { }; unsigned long swapper_pg_dir; void *stack; + unsigned int cpu; }; extern struct secondary_data secondary_data; extern void secondary_startup(void); diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S index 0fc814bbc34b..5aa8ef42717f 100644 --- a/arch/arm/kernel/head-nommu.S +++ b/arch/arm/kernel/head-nommu.S @@ -114,6 +114,7 @@ ENTRY(secondary_startup) add r12, r12, r10 ret r12 1: bl __after_proc_init + ldr r0, [r7, #16] @ set up cpu number ldr sp, [r7, #12] @ set up the stack pointer mov fp, #0 b secondary_start_kernel diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 7f62c5eccdf3..0e541af738e2 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S @@ -394,6 +394,7 @@ ENDPROC(secondary_startup_arm) ENTRY(__secondary_switched) ldr_l r7, secondary_data + 12 @ get secondary_data.stack + ldr_l r0, secondary_data + 16 @ get secondary_data.cpu mov sp, r7 mov fp, #0 b secondary_start_kernel diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 73ca7797b92f..ca0201635fac 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -532,12 +532,6 @@ void notrace cpu_init(void) BUG(); } - /* - * This only works on resume and secondary cores. For booting on the - * boot cpu, smp_prepare_boot_cpu is called after percpu area setup. - */ - set_my_cpu_offset(per_cpu_offset(cpu)); - cpu_proc_init(); /* diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 74679240a9d8..55cb1689a4b3 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -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.cpu = cpu; sync_cache_w(&secondary_data); /* @@ -373,11 +374,14 @@ void arch_cpu_idle_dead(void) * cpu initialisation. There's some initialisation which needs * to be repeated to undo the effects of taking the CPU offline. */ - __asm__("mov sp, %0\n" + __asm__("mov r0, %1\n" + " mov sp, %0\n" " mov fp, #0\n" " b secondary_start_kernel" : - : "r" (task_stack_page(current) + THREAD_SIZE - 8)); + : "r" (task_stack_page(current) + THREAD_SIZE - 8), + "r" (cpu) + : "r0"); } #endif /* CONFIG_HOTPLUG_CPU */ @@ -400,10 +404,11 @@ 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(unsigned int cpu) { struct mm_struct *mm = &init_mm; - unsigned int cpu; + + set_my_cpu_offset(per_cpu_offset(cpu)); secondary_biglittle_init(); @@ -420,7 +425,6 @@ asmlinkage void secondary_start_kernel(void) * All kernel threads share the same mm context; grab a * reference and switch to it. */ - cpu = smp_processor_id(); mmgrab(mm); current->active_mm = mm; cpumask_set_cpu(cpu, mm_cpumask(mm)); -- 2.33.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2021-09-04 6:09 UTC|newest] Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-09-02 15:54 [PATCH 0/2]: ARM: Enable THREAD_INFO_IN_TASK Keith Packard 2021-09-02 15:54 ` Keith Packard 2021-09-02 15:54 ` [PATCH 1/2] ARM: Add per-cpu variable holding cpu number Keith Packard 2021-09-02 15:54 ` Keith Packard 2021-09-02 15:54 ` [PATCH 2/2] ARM: Move thread_info into task_struct Keith Packard 2021-09-02 15:54 ` Keith Packard 2021-09-02 16:07 ` [PATCH 0/2]: ARM: Enable THREAD_INFO_IN_TASK Kees Cook 2021-09-02 16:07 ` Kees Cook 2021-09-02 16:18 ` Ard Biesheuvel 2021-09-02 16:18 ` Ard Biesheuvel 2021-09-02 17:37 ` Kees Cook 2021-09-02 17:37 ` Kees Cook 2021-09-02 16:54 ` Russell King (Oracle) 2021-09-02 16:54 ` Russell King (Oracle) 2021-09-02 16:53 ` Russell King (Oracle) 2021-09-02 16:53 ` Russell King (Oracle) 2021-09-02 17:35 ` Kees Cook 2021-09-02 17:35 ` Kees Cook 2021-09-02 17:58 ` Keith Packard 2021-09-02 17:58 ` Keith Packard 2021-09-04 6:09 ` [PATCH 0/2] ARM: support THREAD_INFO_IN_TASK (v7 only) (v2) Keith Packard 2021-09-04 6:09 ` Keith Packard 2021-09-04 6:09 ` Keith Packard [this message] 2021-09-04 6:09 ` [PATCH 1/3] ARM: Pass cpu number to secondary_start_kernel Keith Packard 2021-09-05 20:25 ` Ard Biesheuvel 2021-09-05 20:25 ` Ard Biesheuvel 2021-09-04 6:09 ` [PATCH 2/3] ARM: Move thread_info into task_struct (v7 only) Keith Packard 2021-09-04 6:09 ` Keith Packard 2021-09-05 20:56 ` Ard Biesheuvel 2021-09-05 20:56 ` Ard Biesheuvel 2021-09-06 6:14 ` Keith Packard 2021-09-06 6:14 ` Keith Packard 2021-09-06 7:49 ` Ard Biesheuvel 2021-09-06 7:49 ` Ard Biesheuvel 2021-09-07 15:24 ` Keith Packard 2021-09-07 15:24 ` Keith Packard 2021-09-07 16:05 ` Ard Biesheuvel 2021-09-07 16:05 ` Ard Biesheuvel 2021-09-07 22:17 ` Keith Packard 2021-09-07 22:17 ` Keith Packard 2021-09-06 6:20 ` Keith Packard 2021-09-06 6:20 ` Keith Packard 2021-09-04 6:09 ` [PATCH 3/3] ARM: Add per-cpu variable cpu_number " Keith Packard 2021-09-04 6:09 ` Keith Packard 2021-09-07 22:00 ` [PATCH 0/7] ARM: support THREAD_INFO_IN_TASK (v3) Keith Packard 2021-09-07 22:00 ` Keith Packard 2021-09-07 22:00 ` [PATCH 1/7] ARM: Pass cpu number to secondary_start_kernel Keith Packard 2021-09-07 22:00 ` Keith Packard 2021-09-07 22:00 ` [PATCH 2/7] ARM: Pass task " Keith Packard 2021-09-07 22:00 ` Keith Packard 2021-09-07 22:00 ` [PATCH 3/7] ARM: Use smp_processor_id() in vfp_pm_suspend instead of ti->cpu Keith Packard 2021-09-07 22:00 ` Keith Packard 2021-09-07 22:00 ` [PATCH 4/7] ARM: Use hack from powerpc to get current cpu number Keith Packard 2021-09-07 22:00 ` Keith Packard 2021-09-08 7:45 ` Ard Biesheuvel 2021-09-08 7:45 ` Ard Biesheuvel 2021-09-07 22:00 ` [PATCH 5/7] ARM: Stop using TPIDRPRW to hold per_cpu_offset Keith Packard 2021-09-07 22:00 ` Keith Packard 2021-09-09 13:54 ` Ard Biesheuvel 2021-09-09 13:54 ` Ard Biesheuvel 2021-09-07 22:00 ` [PATCH 6/7] ARM: Use TPIDRPRW for current Keith Packard 2021-09-07 22:00 ` Keith Packard 2021-09-09 13:56 ` Ard Biesheuvel 2021-09-09 13:56 ` Ard Biesheuvel 2021-09-07 22:00 ` [PATCH 7/7] ARM: Move thread_info into task_struct (v7 only) Keith Packard 2021-09-07 22:00 ` Keith Packard 2021-09-08 7:01 ` [PATCH 0/7] ARM: support THREAD_INFO_IN_TASK (v3) Krzysztof Kozlowski 2021-09-08 7:01 ` Krzysztof Kozlowski 2021-09-08 7:47 ` Ard Biesheuvel 2021-09-08 7:47 ` Ard Biesheuvel 2021-09-08 7:50 ` Geert Uytterhoeven 2021-09-08 7:50 ` Geert Uytterhoeven
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210904060908.1310204-2-keithp@keithp.com \ --to=keithp@keithp.com \ --cc=akpm@linux-foundation.org \ --cc=alexander.sverdlin@gmail.com \ --cc=anshuman.khandual@arm.com \ --cc=ardb@kernel.org \ --cc=arnd@arndb.de \ --cc=axboe@kernel.dk \ --cc=bjorn.andersson@linaro.org \ --cc=f.fainelli@gmail.com \ --cc=geert+renesas@glider.be \ --cc=hsweeten@visionengravers.com \ --cc=jiancai@google.com \ --cc=joe@perches.com \ --cc=keescook@chromium.org \ --cc=keithpac@amazon.com \ --cc=krzysztof.kozlowski@canonical.com \ --cc=linus.walleij@linaro.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux@armlinux.org.uk \ --cc=liuwenliang@huawei.com \ --cc=mani@kernel.org \ --cc=masahiroy@kernel.org \ --cc=maz@kernel.org \ --cc=nathan@kernel.org \ --cc=ndesaulniers@google.com \ --cc=nico@fluxnic.net \ --cc=ojeda@kernel.org \ --cc=robh@kernel.org \ --cc=rppt@kernel.org \ --cc=tglx@linutronix.de \ --cc=u.kleine-koenig@pengutronix.de \ --cc=valentin.schneider@arm.com \ --cc=viresh.kumar@linaro.org \ --cc=wsa+renesas@sang-engineering.com \ --cc=yifeifz2@illinois.edu \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.