[PATCH 3/8] arm64: stacktrace: move SDEI stack helpers to stacktrace code

Kalesh Singh kaleshsingh at google.com
Mon Aug 1 21:53:35 PDT 2022


On Mon, Aug 1, 2022 at 5:12 AM Mark Rutland <mark.rutland at arm.com> wrote:
>
> For clarity and ease of maintenance, it would be helpful for all the
> stack helpers to be in the same place.
>
> Move the SDEI stack helpers into the stacktrace code where all the other
> stack helpers live.
>
> There should be no functional change as a result of this patch.
>
> Signed-off-by: Mark Rutland <mark.rutland at arm.com>
> Cc: Catalin Marinas <catalin.marinas at arm.com>
> Cc: Fuad Tabba <tabba at google.com>
> Cc: James Morse <james.morse at arm.com>
> Cc: Kalesh Singh <kaleshsingh at google.com>
> Cc: Madhavan T. Venkataraman <madvenka at linux.microsoft.com>
> Cc: Marc Zyngier <maz at kernel.org>
> Cc: Mark Brown <broonie at kernel.org>
> Cc: Will Deacon <will at kernel.org>
> ---
>  arch/arm64/include/asm/sdei.h       | 17 ------------
>  arch/arm64/include/asm/stacktrace.h | 40 ++++++++++++++++++++++++++++-
>  arch/arm64/kernel/sdei.c            | 35 -------------------------
>  arch/arm64/kernel/stacktrace.c      | 13 ++++++++--
>  4 files changed, 50 insertions(+), 55 deletions(-)
>
> diff --git a/arch/arm64/include/asm/sdei.h b/arch/arm64/include/asm/sdei.h
> index 7bea1d705dd64..4292d9bafb9d2 100644
> --- a/arch/arm64/include/asm/sdei.h
> +++ b/arch/arm64/include/asm/sdei.h
> @@ -43,22 +43,5 @@ unsigned long do_sdei_event(struct pt_regs *regs,
>  unsigned long sdei_arch_get_entry_point(int conduit);
>  #define sdei_arch_get_entry_point(x)   sdei_arch_get_entry_point(x)
>
> -struct stack_info;
> -
> -bool _on_sdei_stack(unsigned long sp, unsigned long size,
> -                   struct stack_info *info);
> -static inline bool on_sdei_stack(unsigned long sp, unsigned long size,
> -                               struct stack_info *info)
> -{
> -       if (!IS_ENABLED(CONFIG_VMAP_STACK))
> -               return false;
> -       if (!IS_ENABLED(CONFIG_ARM_SDE_INTERFACE))
> -               return false;
> -       if (in_nmi())
> -               return _on_sdei_stack(sp, size, info);
> -
> -       return false;
> -}
> -
>  #endif /* __ASSEMBLY__ */
>  #endif /* __ASM_SDEI_H */
> diff --git a/arch/arm64/include/asm/stacktrace.h b/arch/arm64/include/asm/stacktrace.h
> index 6ebdcdff77f56..fa2df1ea22ebc 100644
> --- a/arch/arm64/include/asm/stacktrace.h
> +++ b/arch/arm64/include/asm/stacktrace.h
> @@ -54,7 +54,45 @@ static inline bool on_overflow_stack(unsigned long sp, unsigned long size,
>  }
>  #else
>  static inline bool on_overflow_stack(unsigned long sp, unsigned long size,
> -                       struct stack_info *info) { return false; }
> +                                    struct stack_info *info)
> +{
> +       return false;
> +}
> +#endif
> +
> +#if defined(CONFIG_ARM_SDE_INTERFACE) && defined(CONFIG_VMAP_STACK)
> +DECLARE_PER_CPU(unsigned long *, sdei_stack_normal_ptr);
> +DECLARE_PER_CPU(unsigned long *, sdei_stack_critical_ptr);
> +
> +static inline bool on_sdei_normal_stack(unsigned long sp, unsigned long size,
> +                                       struct stack_info *info)
> +{
> +       unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_normal_ptr);
> +       unsigned long high = low + SDEI_STACK_SIZE;
> +
> +       return on_stack(sp, size, low, high, STACK_TYPE_SDEI_NORMAL, info);
> +}
> +
> +static inline bool on_sdei_critical_stack(unsigned long sp, unsigned long size,
> +                                         struct stack_info *info)
> +{
> +       unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_critical_ptr);
> +       unsigned long high = low + SDEI_STACK_SIZE;
> +
> +       return on_stack(sp, size, low, high, STACK_TYPE_SDEI_CRITICAL, info);
> +}
> +#else
> +static inline bool on_sdei_normal_stack(unsigned long sp, unsigned long size,
> +                                       struct stack_info *info)
> +{
> +       return false;
> +}
> +
> +static inline bool on_sdei_critical_stack(unsigned long sp, unsigned long size,
> +                                         struct stack_info *info)
> +{
> +       return false;
> +}
>  #endif
>
>  #endif /* __ASM_STACKTRACE_H */
> diff --git a/arch/arm64/kernel/sdei.c b/arch/arm64/kernel/sdei.c
> index d20620a1c51a4..881eece3422ca 100644
> --- a/arch/arm64/kernel/sdei.c
> +++ b/arch/arm64/kernel/sdei.c
> @@ -31,9 +31,6 @@ unsigned long sdei_exit_mode;
>   * sdei stack.
>   * For now, we allocate stacks when the driver is probed.
>   */
> -DECLARE_PER_CPU(unsigned long *, sdei_stack_normal_ptr);
> -DECLARE_PER_CPU(unsigned long *, sdei_stack_critical_ptr);
> -
>  #ifdef CONFIG_VMAP_STACK
>  DEFINE_PER_CPU(unsigned long *, sdei_stack_normal_ptr);
>  DEFINE_PER_CPU(unsigned long *, sdei_stack_critical_ptr);
> @@ -162,38 +159,6 @@ static int init_sdei_scs(void)
>         return err;
>  }
>
> -static bool on_sdei_normal_stack(unsigned long sp, unsigned long size,
> -                                struct stack_info *info)
> -{
> -       unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_normal_ptr);
> -       unsigned long high = low + SDEI_STACK_SIZE;
> -
> -       return on_stack(sp, size, low, high, STACK_TYPE_SDEI_NORMAL, info);
> -}
> -
> -static bool on_sdei_critical_stack(unsigned long sp, unsigned long size,
> -                                  struct stack_info *info)
> -{
> -       unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_critical_ptr);
> -       unsigned long high = low + SDEI_STACK_SIZE;
> -
> -       return on_stack(sp, size, low, high, STACK_TYPE_SDEI_CRITICAL, info);
> -}
> -
> -bool _on_sdei_stack(unsigned long sp, unsigned long size, struct stack_info *info)
> -{
> -       if (!IS_ENABLED(CONFIG_VMAP_STACK))
> -               return false;
> -
> -       if (on_sdei_critical_stack(sp, size, info))
> -               return true;
> -
> -       if (on_sdei_normal_stack(sp, size, info))
> -               return true;
> -
> -       return false;
> -}
> -
>  unsigned long sdei_arch_get_entry_point(int conduit)
>  {
>         /*
> diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
> index 4c8865e495fea..04a9b56b114c1 100644
> --- a/arch/arm64/kernel/stacktrace.c
> +++ b/arch/arm64/kernel/stacktrace.c
> @@ -86,8 +86,17 @@ static bool on_accessible_stack(const struct task_struct *tsk,
>                 return true;
>         if (on_overflow_stack(sp, size, info))
>                 return true;
> -       if (on_sdei_stack(sp, size, info))
> -               return true;
> +
> +       if (IS_ENABLED(CONFIG_VMAP_STACK) &&
> +           IS_ENABLED(CONFIG_ARM_SDE_INTERFACE) &&
> +           in_nmi())

I think we can remove the IS_ENABLED() checks since it's handled by
ifdefs in asm/stacktrace.h

Otherwise, Reviewed-by: Kalesh Singh <kaleshsingh at google.com>

> +       {
> +               if (on_sdei_critical_stack(sp, size, info))
> +                       return true;
> +
> +               if (on_sdei_normal_stack(sp, size, info))
> +                       return true;
> +       }
>
>         return false;
>  }
> --
> 2.30.2
>



More information about the linux-arm-kernel mailing list