[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