Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5EC2FC433FE for ; Mon, 13 Dec 2021 12:51:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236320AbhLMMvH (ORCPT ); Mon, 13 Dec 2021 07:51:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44526 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231719AbhLMMvG (ORCPT ); Mon, 13 Dec 2021 07:51:06 -0500 Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com [IPv6:2a00:1450:4864:20::42f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0D1C3C061574 for ; Mon, 13 Dec 2021 04:51:06 -0800 (PST) Received: by mail-wr1-x42f.google.com with SMTP id u1so26769077wru.13 for ; Mon, 13 Dec 2021 04:51:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brainfault-org.20210112.gappssmtp.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=0iqENYZSp6tSgjjC4SuN/3Acy/dnviQPfcQyyNgDGRk=; b=n1t7NoZcSyyBr1W5m5qXqOdFkLF/67CvHxuHX1IpWxjF4nNPS3Avg1h2fCPjIh0tsa tOO69+ufgkWt5i6NZLQyjAqqaf4sh+/VCo8tThM9rhuZ0UaBYooiuw/3m+UsFyonZgJZ 9cmVmxvJCTmxkS662qY9NQMmx2dpk4i5mo+G5U1ZVIapKBhB/vcU8cnkViH5+WSeycbt pnjieEOIedzWgcXNpqX9LTmMDfj7R7yATOnzFkiYWcWkV1pTkUR39LVnqdAd5bsK07Nf 5pIEAfdCgdwerzLNlW3mJHgj1Rb1jPDo0AyaAz0zIf0EgjJONPeBw8L0+pyXQfejCS6h uPsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=0iqENYZSp6tSgjjC4SuN/3Acy/dnviQPfcQyyNgDGRk=; b=fpCO62WukW6xyo2QWBlKwB2CBRUx6NkL5TOSMwo9Vq5+Ig/45WLc6wYP2pms+09ujZ bM7WqytR8BJWkeFXvz8GWR/TIlp5jJ4ekCfIvV6flTjjNYuCX60iFOyevumajHBY00el hxgRWdkh3JxEkzMcVjs1EPoUSfYeH7ZkbtVnc0hvHdtbbmIWWWy1CoHe4ZND0Iomz2ff vALL4Zj6KAfxGUJ+xa5MCaajUOjqieuQ3pwjHpqCG3sLGLBp6nkebTvDY3XI/BHmeEn7 I/vOlEXPNnOQWMyTF4coK8pFe0zlc1zcQT4X4dILW9KF06MY/yYEWGxRrC/MTa0LlsOr pjHg== X-Gm-Message-State: AOAM531Bwt/LjSs8vn2wWvXTZN8Nksxa6liDc6JnoUL0994VWjqaZo5B NACR2ylOK8NwNZXQX0GLz8QAgqgSVf1AYfpRhix4TViNFV7OIg== X-Google-Smtp-Source: ABdhPJwhRBxzcU2sZmpZJ76xIFNOAwnPDA8amkxOz894Oz6Kb/RYU/lWrmTV7IbTIqzN/Tp1V+wjLU/loVeixDuqYU8= X-Received: by 2002:a5d:4909:: with SMTP id x9mr32773413wrq.313.1639399864386; Mon, 13 Dec 2021 04:51:04 -0800 (PST) MIME-Version: 1.0 References: <20211204002038.113653-1-atishp@atishpatra.org> <20211204002038.113653-4-atishp@atishpatra.org> In-Reply-To: <20211204002038.113653-4-atishp@atishpatra.org> From: Anup Patel Date: Mon, 13 Dec 2021 18:20:52 +0530 Message-ID: Subject: Re: [RFC 3/6] RISC-V: Use __cpu_up_stack/task_pointer only for spinwait method To: Atish Patra Cc: "linux-kernel@vger.kernel.org List" , Atish Patra , Alexandre Ghiti , Anup Patel , Greentime Hu , Guo Ren , Heinrich Schuchardt , Ingo Molnar , Jisheng Zhang , kvm-riscv@lists.infradead.org, KVM General , linux-riscv , Marc Zyngier , Nanyong Sun , Nick Kossifidis , Palmer Dabbelt , Paul Walmsley , Pekka Enberg , Vincent Chen , Vitaly Wool Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, Dec 4, 2021 at 5:51 AM Atish Patra wrote: > > From: Atish Patra > > The __cpu_up_stack/task_pointer array is only used for spinwait method > now. The per cpu array based lookup is also fragile for platforms with > discontiguous/sparse hartids. The spinwait method is only used for > M-mode Linux or older firmwares without SBI HSM extension. For general > Linux systems, ordered booting method is preferred anyways to support > cpu hotplug and kexec. > > Make sure that __cpu_up_stack/task_pointer is only used for spinwait > method. Take this opportunity to rename it to > __cpu_spinwait_stack/task_pointer to emphasize the purpose as well. > > Signed-off-by: Atish Patra Looks good to me. Reviewed-by: Anup Patel Regards, Anup > --- > arch/riscv/include/asm/cpu_ops.h | 2 -- > arch/riscv/kernel/cpu_ops.c | 16 ---------------- > arch/riscv/kernel/cpu_ops_spinwait.c | 27 ++++++++++++++++++++++++++- > arch/riscv/kernel/head.S | 4 ++-- > arch/riscv/kernel/head.h | 4 ++-- > 5 files changed, 30 insertions(+), 23 deletions(-) > > diff --git a/arch/riscv/include/asm/cpu_ops.h b/arch/riscv/include/asm/cpu_ops.h > index a8ec3c5c1bd2..134590f1b843 100644 > --- a/arch/riscv/include/asm/cpu_ops.h > +++ b/arch/riscv/include/asm/cpu_ops.h > @@ -40,7 +40,5 @@ struct cpu_operations { > > extern const struct cpu_operations *cpu_ops[NR_CPUS]; > void __init cpu_set_ops(int cpu); > -void cpu_update_secondary_bootdata(unsigned int cpuid, > - struct task_struct *tidle); > > #endif /* ifndef __ASM_CPU_OPS_H */ > diff --git a/arch/riscv/kernel/cpu_ops.c b/arch/riscv/kernel/cpu_ops.c > index 3f5a38b03044..c1e30f403c3b 100644 > --- a/arch/riscv/kernel/cpu_ops.c > +++ b/arch/riscv/kernel/cpu_ops.c > @@ -8,31 +8,15 @@ > #include > #include > #include > -#include > #include > #include > #include > > const struct cpu_operations *cpu_ops[NR_CPUS] __ro_after_init; > > -void *__cpu_up_stack_pointer[NR_CPUS] __section(".data"); > -void *__cpu_up_task_pointer[NR_CPUS] __section(".data"); > - > extern const struct cpu_operations cpu_ops_sbi; > extern const struct cpu_operations cpu_ops_spinwait; > > -void cpu_update_secondary_bootdata(unsigned int cpuid, > - struct task_struct *tidle) > -{ > - int hartid = cpuid_to_hartid_map(cpuid); > - > - /* Make sure tidle is updated */ > - smp_mb(); > - WRITE_ONCE(__cpu_up_stack_pointer[hartid], > - task_stack_page(tidle) + THREAD_SIZE); > - WRITE_ONCE(__cpu_up_task_pointer[hartid], tidle); > -} > - > void __init cpu_set_ops(int cpuid) > { > #if IS_ENABLED(CONFIG_RISCV_SBI) > diff --git a/arch/riscv/kernel/cpu_ops_spinwait.c b/arch/riscv/kernel/cpu_ops_spinwait.c > index b2c957bb68c1..9f398eb94f7a 100644 > --- a/arch/riscv/kernel/cpu_ops_spinwait.c > +++ b/arch/riscv/kernel/cpu_ops_spinwait.c > @@ -6,11 +6,36 @@ > #include > #include > #include > +#include > #include > #include > #include > > const struct cpu_operations cpu_ops_spinwait; > +void *__cpu_spinwait_stack_pointer[NR_CPUS] __section(".data"); > +void *__cpu_spinwait_task_pointer[NR_CPUS] __section(".data"); > + > +static void cpu_update_secondary_bootdata(unsigned int cpuid, > + struct task_struct *tidle) > +{ > + int hartid = cpuid_to_hartid_map(cpuid); > + > + /* > + * The hartid must be less than NR_CPUS to avoid out-of-bound access > + * errors for __cpu_spinwait_stack/task_pointer. That is not always possible > + * for platforms with discontiguous hartid numbering scheme. That's why > + * spinwait booting is not the recommended approach for any platforms > + * and will be removed in future. > + */ > + if (hartid == INVALID_HARTID || hartid >= NR_CPUS) > + return; > + > + /* Make sure tidle is updated */ > + smp_mb(); > + WRITE_ONCE(__cpu_spinwait_stack_pointer[hartid], > + task_stack_page(tidle) + THREAD_SIZE); > + WRITE_ONCE(__cpu_spinwait_task_pointer[hartid], tidle); > +} > > static int spinwait_cpu_prepare(unsigned int cpuid) > { > @@ -28,7 +53,7 @@ static int spinwait_cpu_start(unsigned int cpuid, struct task_struct *tidle) > * selects the first cpu to boot the kernel and causes the remainder > * of the cpus to spin in a loop waiting for their stack pointer to be > * setup by that main cpu. Writing to bootdata > - * (i.e __cpu_up_stack_pointer) signals to the spinning cpus that they > + * (i.e __cpu_spinwait_stack_pointer) signals to the spinning cpus that they > * can continue the boot process. > */ > cpu_update_secondary_bootdata(cpuid, tidle); > diff --git a/arch/riscv/kernel/head.S b/arch/riscv/kernel/head.S > index 40d4c625513c..6f8e99eac6a1 100644 > --- a/arch/riscv/kernel/head.S > +++ b/arch/riscv/kernel/head.S > @@ -347,9 +347,9 @@ clear_bss_done: > csrw CSR_TVEC, a3 > > slli a3, a0, LGREG > - la a1, __cpu_up_stack_pointer > + la a1, __cpu_spinwait_stack_pointer > XIP_FIXUP_OFFSET a1 > - la a2, __cpu_up_task_pointer > + la a2, __cpu_spinwait_task_pointer > XIP_FIXUP_OFFSET a2 > add a1, a3, a1 > add a2, a3, a2 > diff --git a/arch/riscv/kernel/head.h b/arch/riscv/kernel/head.h > index aabbc3ac3e48..5393cca77790 100644 > --- a/arch/riscv/kernel/head.h > +++ b/arch/riscv/kernel/head.h > @@ -16,7 +16,7 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa); > asmlinkage void __init __copy_data(void); > #endif > > -extern void *__cpu_up_stack_pointer[]; > -extern void *__cpu_up_task_pointer[]; > +extern void *__cpu_spinwait_stack_pointer[]; > +extern void *__cpu_spinwait_task_pointer[]; > > #endif /* __ASM_HEAD_H */ > -- > 2.33.1 >