On Tue, Mar 15, 2022 at 2:56 PM Jan Kiszka <jan.kis...@siemens.com> wrote:

> From: Jan Kiszka <jan.kis...@siemens.com>
>
> First of all, this erratum hook is called from __switch_to, thus
> potentially also from the primary domain. Some of the functions it calls
> check if preemption was disabled under Linux - which may not be the case
> when invoked from primary domain. Rather than adding a costly check for
> ipipe_root_p to this hot-path, simply turn the check off if I-pipe is
> enabled.
>
> As the hook can be called from primary context, we need to protect its
> setup for new execs against those contexts via hard_preempt_disable.
>
> Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>
> ---
>
> This is for 5.4-only, older kernels do no have the erratum fix.
>
> Philippe, the hardening of erratum_1418040_new_exec() could be a topic
> for dovetail as well. preemptible() is fully oob-aware there, though.
>
>  arch/arm64/kernel/cpu_errata.c | 3 ++-
>  arch/arm64/kernel/cpufeature.c | 3 ++-
>  arch/arm64/kernel/process.c    | 4 ++--
>  3 files changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm64/kernel/cpu_errata.c
> b/arch/arm64/kernel/cpu_errata.c
> index 1e16c4e00e771..7fd7d1c8b9fcc 100644
> --- a/arch/arm64/kernel/cpu_errata.c
> +++ b/arch/arm64/kernel/cpu_errata.c
> @@ -37,7 +37,8 @@ static bool __maybe_unused
>  is_affected_midr_range_list(const struct arm64_cpu_capabilities *entry,
>                             int scope)
>  {
> -       WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
> +       WARN_ON(scope != SCOPE_LOCAL_CPU ||
> +               (preemptible() && !IS_ENABLED(CONFIG_IPIPE)));
>         return is_midr_in_range_list(read_cpuid_id(),
> entry->midr_range_list);
>  }
>
> diff --git a/arch/arm64/kernel/cpufeature.c
> b/arch/arm64/kernel/cpufeature.c
> index acdef8d76c64d..d65287cc2148b 100644
> --- a/arch/arm64/kernel/cpufeature.c
> +++ b/arch/arm64/kernel/cpufeature.c
> @@ -2023,7 +2023,8 @@ static void __init mark_const_caps_ready(void)
>
>  bool this_cpu_has_cap(unsigned int n)
>  {
> -       if (!WARN_ON(preemptible()) && n < ARM64_NCAPS) {
> +       if (!WARN_ON(!IS_ENABLED(CONFIG_IPIPE) && preemptible()) &&
> +           n < ARM64_NCAPS) {
>                 const struct arm64_cpu_capabilities *cap =
> cpu_hwcaps_ptrs[n];
>
>                 if (cap)
> diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
> index 68c078ab0250c..879ecf0237c88 100644
> --- a/arch/arm64/kernel/process.c
> +++ b/arch/arm64/kernel/process.c
> @@ -517,9 +517,9 @@ static void erratum_1418040_thread_switch(struct
> task_struct *next)
>
>  static void erratum_1418040_new_exec(void)
>  {
> -       preempt_disable();
> +       unsigned long flags = hard_preempt_disable();
>         erratum_1418040_thread_switch(current);
> -       preempt_enable();
> +       hard_preempt_enable(flags);
>  }
>
>  /*
> --
> 2.34.1


Hi Jan,

Thanks for the patch, I’ll have time to test it tomorrow.

Thanks

Greg

>
>

Reply via email to