[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