[PATCH v3 00/14] ARM: enable IRQ stacks and vmap'ed stacks for UP
Vladimir Murzin
vladimir.murzin at arm.com
Fri Dec 3 02:46:59 PST 2021
On 12/3/21 10:08 AM, Ard Biesheuvel wrote:
> First, 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.
>
> Changes since v2:
> - support THREAD_INFO_IN_TASK and the IRQ stack on v7m as well,
> - incorporate a v7m cleanup from Vladimir to enable the above,
> - avoid declaring smp_on_up globally,
> - fix an oversight in the IOP32x IRQ #0 fix
> - add some more acks
>
> Changes since RFC/v1:
> - add five preparatory patches that move RiscPC, IOP32x and Footbridge
> to GENERIC_IRQ_MULTI_HANDLER so that even these ancient platforms can
> benefit from the IRQ stacks changes for UP that this series proposes
> (contributed by Arnd)
> - fix various issues related to SMP+v6 corner cases that were caught by
> kernelci testing;
> - add acks from Nico and Linus (thanks!)
>
> 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>
> Cc: Marc Zyngier <maz at kernel.org>
> Cc: Vladimir Murzin <vladimir.murzin at arm.com>
> Cc: Jesse Taube <mr.bossman075 at gmail.com>
>
> Ard Biesheuvel (8):
> ARM: entry: preserve thread_info pointer in switch_to
> ARM: module: implement support for PC-relative group relocations
> ARM: assembler: add optimized ldr/str macros to load variables from
> memory
> ARM: percpu: add SMP_ON_UP support
> ARM: use TLS register for 'current' on !SMP as well
> ARM: smp: defer TPIDRURO update for SMP v6 configurations too
> ARM: implement THREAD_INFO_IN_TASK for uniprocessor systems
> ARM: v7m: enable support for IRQ stacks
>
> Arnd Bergmann (5):
> ARM: riscpc: use GENERIC_IRQ_MULTI_HANDLER
> ARM: footbridge: use GENERIC_IRQ_MULTI_HANDLER
> ARM: iop32x: offset IRQ numbers by 1
> ARM: iop32x: use GENERIC_IRQ_MULTI_HANDLER
> ARM: remove old-style irq entry
>
> Vladimir Murzin (1):
> irqchip: nvic: Use GENERIC_IRQ_MULTI_HANDLER
>
> arch/arm/Kconfig | 22 +--
> arch/arm/include/asm/assembler.h | 185 ++++++++++++++++----
> arch/arm/include/asm/current.h | 37 ++--
> arch/arm/include/asm/elf.h | 3 +
> arch/arm/include/asm/entry-macro-multi.S | 16 --
> arch/arm/include/asm/hardware/entry-macro-iomd.S | 131 --------------
> arch/arm/include/asm/insn.h | 24 +++
> arch/arm/include/asm/irq.h | 1 -
> arch/arm/include/asm/mach/arch.h | 2 -
> arch/arm/include/asm/percpu.h | 25 ++-
> arch/arm/include/asm/switch_to.h | 3 +-
> arch/arm/include/asm/thread_info.h | 27 ---
> arch/arm/include/asm/tls.h | 13 +-
> arch/arm/include/asm/v7m.h | 3 +-
> arch/arm/kernel/asm-offsets.c | 3 -
> arch/arm/kernel/entry-armv.S | 48 ++---
> arch/arm/kernel/entry-common.S | 16 +-
> arch/arm/kernel/entry-header.S | 13 +-
> arch/arm/kernel/entry-v7m.S | 39 +++--
> arch/arm/kernel/head-common.S | 4 +-
> arch/arm/kernel/irq.c | 17 --
> arch/arm/kernel/module.c | 63 +++++++
> arch/arm/kernel/process.c | 7 +-
> arch/arm/kernel/sleep.S | 4 +-
> arch/arm/kernel/smp.c | 11 ++
> arch/arm/kernel/traps.c | 4 +
> arch/arm/mach-footbridge/common.c | 87 +++++++++
> arch/arm/mach-footbridge/include/mach/entry-macro.S | 107 -----------
> arch/arm/mach-iop32x/cp6.c | 10 +-
> arch/arm/mach-iop32x/include/mach/entry-macro.S | 31 ----
> arch/arm/mach-iop32x/include/mach/irqs.h | 2 +-
> arch/arm/mach-iop32x/iop3xx.h | 1 +
> arch/arm/mach-iop32x/irq.c | 29 ++-
> arch/arm/mach-iop32x/irqs.h | 60 ++++---
> arch/arm/mach-rpc/fiq.S | 5 +-
> arch/arm/mach-rpc/include/mach/entry-macro.S | 13 --
> arch/arm/mach-rpc/irq.c | 145 +++++++++++++++
> arch/arm/mm/Kconfig | 1 +
> drivers/irqchip/Kconfig | 1 +
> drivers/irqchip/irq-nvic.c | 22 +--
> 40 files changed, 695 insertions(+), 540 deletions(-)
> delete mode 100644 arch/arm/include/asm/entry-macro-multi.S
> delete mode 100644 arch/arm/include/asm/hardware/entry-macro-iomd.S
> delete mode 100644 arch/arm/mach-footbridge/include/mach/entry-macro.S
> delete mode 100644 arch/arm/mach-iop32x/include/mach/entry-macro.S
> delete mode 100644 arch/arm/mach-rpc/include/mach/entry-macro.S
>
Tested-by: Vladimir Murzin <vladimir.murzin at arm.com> # ARMv7M
Thanks!
Vladimir
More information about the linux-arm-kernel
mailing list