[PATCH v4 00/15] ARM: enable IRQ stacks and vmap'ed stacks for UP
Ard Biesheuvel
ardb at kernel.org
Mon Dec 6 08:46:44 PST 2021
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 v3:
- remove some dead code from the RiscPC interrupt handling routines
before porting them to C, as suggested by Russell;
- add clarifying comments to the module loader patch to explain where
the group relocations are defined, and how to process them;
- add some RBs and TBs
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 (9):
ARM: riscpc: drop support for IOMD_IRQREQC/IOMD_IRQREQD IRQ groups
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 | 85 +++++++++
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 | 95 ++++++++++
arch/arm/mm/Kconfig | 1 +
drivers/irqchip/Kconfig | 1 +
drivers/irqchip/irq-nvic.c | 22 +--
40 files changed, 667 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
--
2.30.2
More information about the linux-arm-kernel
mailing list