[RFC PATCH 0/6] ARM: enable IRQ stacks and vmap'ed stacks for UP

Nicolas Pitre nico at fluxnic.net
Mon Nov 29 08:32:57 PST 2021


On Fri, 26 Nov 2021, Ard Biesheuvel wrote:

> Enable the use of the TLS register to hold the 'current' pointer for all
> configurations that can support it, including non-SMP ones that target
> v6k or later CPUs, and multi-platform SMP ones that also support v6
> based UP systems.
> 
> The remaining configurations are all strictly UP, which means we can
> switch to a global variable to hold the current pointer. By doing this,
> we can enable THREAD_INFO_IN_TASK, which moves thread info off the
> stack, protecting it from overflows. It also permits us to enable IRQ
> stacks and vmap'ed stacks for UP configurations as well.
> 
> Supporting v6 cores without SMP extensions in SMP configurations (e.g.,
> omap2plus_defconfig or imx_v6_v7_defconfig) makes this a bit tricky, and
> this is a feature we may consider dropping entirely in the future. But
> for the time being, we can support this mode as well.
> 
> The accesses to the global variable holding 'current' are constructed in
> a way that ensures that no literal pool accesses (and associated D-cache
> misses) are needed unless the access is from a module and module PLTs
> are enabled. This means that accessing 'current' is just as costly as
> before, as it used to require some arithmetic involving the stack
> pointer and a load from the thread_info::task field.
> 
> However, accessing thread_info itself now also involves a load, although
> it should be noted that all thread_info and current accesses now go via
> the same variable, which is therefore expected to be hot in the caches
> at all times.

Looks nice overall.

Acked-by: Nicolas Pitre <nico at fluxnic.net>

> Cc: Russell King <linux at armlinux.org.uk>
> Cc: Nicolas Pitre <nico at fluxnic.net>
> Cc: Arnd Bergmann <arnd at arndb.de>
> Cc: Kees Cook <keescook at chromium.org>
> Cc: Keith Packard <keithpac at amazon.com>
> Cc: Linus Walleij <linus.walleij at linaro.org>
> Cc: Nick Desaulniers <ndesaulniers at google.com>
> Cc: Tony Lindgren <tony at atomide.com>
> 
> Ard Biesheuvel (6):
>   ARM: entry: preserve thread_info pointer in switch_to
>   ARM: module: implement support for PC-relative group relocations
>   ARM: percpu: add SMP_ON_UP support
>   ARM: smp: defer TPIDRURO update for SMP v6 configurations too
>   ARM: use TLS register for 'current' on !SMP as well
>   ARM: implement THREAD_INFO_IN_TASK for uniprocessor systems
> 
>  arch/arm/Kconfig                   |  10 +-
>  arch/arm/include/asm/assembler.h   | 136 +++++++++++++++-----
>  arch/arm/include/asm/current.h     |  56 +++++++-
>  arch/arm/include/asm/elf.h         |   3 +
>  arch/arm/include/asm/percpu.h      |  29 ++++-
>  arch/arm/include/asm/switch_to.h   |   3 +-
>  arch/arm/include/asm/thread_info.h |  27 ----
>  arch/arm/include/asm/tls.h         |   4 +-
>  arch/arm/kernel/asm-offsets.c      |   3 -
>  arch/arm/kernel/entry-armv.S       |  26 ++--
>  arch/arm/kernel/entry-header.S     |   8 +-
>  arch/arm/kernel/head-common.S      |   4 +-
>  arch/arm/kernel/module.c           |  63 +++++++++
>  arch/arm/kernel/process.c          |   7 +-
>  arch/arm/kernel/traps.c            |   4 +
>  arch/arm/mm/Kconfig                |   1 +
>  16 files changed, 289 insertions(+), 95 deletions(-)
> 
> -- 
> 2.30.2
> 
> 



More information about the linux-arm-kernel mailing list