lkml.org 
[lkml]   [2020]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 038/158] arm64: errata: Fix handling of 1418040 with late CPU onlining
    Date
    From: Will Deacon <will@kernel.org>

    [ Upstream commit f969f03888b9438fdb227b6460d99ede5737326d ]

    In a surprising turn of events, it transpires that CPU capabilities
    configured as ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE are never set as the
    result of late-onlining. Therefore our handling of erratum 1418040 does
    not get activated if it is not required by any of the boot CPUs, even
    though we allow late-onlining of an affected CPU.

    In order to get things working again, replace the cpus_have_const_cap()
    invocation with an explicit check for the current CPU using
    this_cpu_has_cap().

    Cc: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
    Cc: Stephen Boyd <swboyd@chromium.org>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20201106114952.10032-1-will@kernel.org
    Signed-off-by: Will Deacon <will@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/arm64/include/asm/cpufeature.h | 2 ++
    arch/arm64/kernel/process.c | 5 ++---
    2 files changed, 4 insertions(+), 3 deletions(-)

    diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
    index 10d3048dec7c2..ccae05da98a7f 100644
    --- a/arch/arm64/include/asm/cpufeature.h
    +++ b/arch/arm64/include/asm/cpufeature.h
    @@ -262,6 +262,8 @@ extern struct arm64_ftr_reg arm64_ftr_reg_ctrel0;
    /*
    * CPU feature detected at boot time based on feature of one or more CPUs.
    * All possible conflicts for a late CPU are ignored.
    + * NOTE: this means that a late CPU with the feature will *not* cause the
    + * capability to be advertised by cpus_have_*cap()!
    */
    #define ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE \
    (ARM64_CPUCAP_SCOPE_LOCAL_CPU | \
    diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
    index 10190c4b16dc4..7d7cfa128b71b 100644
    --- a/arch/arm64/kernel/process.c
    +++ b/arch/arm64/kernel/process.c
    @@ -511,14 +511,13 @@ static void erratum_1418040_thread_switch(struct task_struct *prev,
    bool prev32, next32;
    u64 val;

    - if (!(IS_ENABLED(CONFIG_ARM64_ERRATUM_1418040) &&
    - cpus_have_const_cap(ARM64_WORKAROUND_1418040)))
    + if (!IS_ENABLED(CONFIG_ARM64_ERRATUM_1418040))
    return;

    prev32 = is_compat_thread(task_thread_info(prev));
    next32 = is_compat_thread(task_thread_info(next));

    - if (prev32 == next32)
    + if (prev32 == next32 || !this_cpu_has_cap(ARM64_WORKAROUND_1418040))
    return;

    val = read_sysreg(cntkctl_el1);
    --
    2.27.0


    \
     
     \ /
      Last update: 2020-11-23 14:09    [W:4.133 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site