[PATCH v3 00/11] powerpc/64: fast interrupt exits
Nicholas Piggin
npiggin at gmail.com
Thu Jun 10 23:09:10 AEST 2021
This series attempts to improve the speed of interrupts and system calls
in three major ways.
Firstly, the SRR/HSRR registers do not need to be reloaded if they were
clobbered for the duration of the interrupt and the return NIP and MSR
did not changed. 64e does not implement this part, but it could quite
easily.
Secondly, mtmsrd and mtspr are reduced by various means, this is mostly
specific to 64s.
Lastly, an alternate interrupt return location facility is added for
soft-masked asynchronous interrupts, and then that's used to set
everything up for return without having to disable MSR RI or EE.
After this series, the entire system call / interrupt handler fast path
can execute with no mtsprs and one mtmsrd to enable interrupts
initially, and the system call vectored path doesn't even need to do
that. This gives a decent performance benefit. On POWER9 with a
powernv_defconfig without VIRT_CPU_ACCOUNTING_NATIVE, no meltdown
workarounds, gettid sc system call goes from 481 -> 344 cycles, gettid
scv 345->299 cycles, and page fault 1225->1064 cycles.
Changes since v2:
- KVM PR compile fix
- Missed SRR clobbers from hcalls causing pseries crashes
- Add program check recursion test to interrupt entry assert,
which prevented pseries crash bug being cleanly reported.
Changes since v1:
- Rebased to upstream
- Reordered paches, updated comments and changelogs.
- Clean ups, fixed ppc32 compile breakage.
- Fixed missing srr invalidations in KVM guest entry/exit.
- Dropped the security fallback rework from the start of the series
because it's quite complicated to change. Instead for now the
incompatible fallbacks just disable the interrupts-enabled exits.
Thanks,
Nick
Nicholas Piggin (11):
powerpc: remove interrupt exit helpers unused argument
powerpc/64s: introduce different functions to return from SRR vs HSRR
interrupts
powerpc/64s: avoid reloading (H)SRR registers if they are still valid
powerpc/64: handle MSR EE and RI in interrupt entry wrapper
powerpc/64: move interrupt return asm to interrupt_64.S
powerpc/64s: system call avoid setting MSR[RI] until we set MSR[EE]
powerpc/64s: save one more register in the masked interrupt handler
powerpc/64: allow alternate return locations for soft-masked
interrupts
powerpc/64: interrupt soft-enable race fix
powerpc/64: treat low kernel text as irqs soft-masked
powerpc/64: use interrupt restart table to speed up return from
interrupt
arch/powerpc/Kconfig.debug | 5 +
arch/powerpc/include/asm/asm-prototypes.h | 4 +-
arch/powerpc/include/asm/head-64.h | 2 +-
arch/powerpc/include/asm/hw_irq.h | 23 +-
arch/powerpc/include/asm/interrupt.h | 60 +-
arch/powerpc/include/asm/paca.h | 7 +
arch/powerpc/include/asm/ppc_asm.h | 8 +
arch/powerpc/include/asm/ptrace.h | 75 ++-
arch/powerpc/kernel/asm-offsets.c | 7 +
arch/powerpc/kernel/entry_64.S | 516 --------------
arch/powerpc/kernel/exceptions-64e.S | 53 +-
arch/powerpc/kernel/exceptions-64s.S | 219 +++---
arch/powerpc/kernel/fpu.S | 2 +
arch/powerpc/kernel/head_64.S | 5 +-
arch/powerpc/kernel/interrupt.c | 389 +++++++----
arch/powerpc/kernel/interrupt_64.S | 749 +++++++++++++++++++++
arch/powerpc/kernel/irq.c | 95 +++
arch/powerpc/kernel/kgdb.c | 2 +-
arch/powerpc/kernel/kprobes-ftrace.c | 2 +-
arch/powerpc/kernel/kprobes.c | 10 +-
arch/powerpc/kernel/process.c | 26 +-
arch/powerpc/kernel/prom_init.c | 3 +
arch/powerpc/kernel/rtas.c | 14 +-
arch/powerpc/kernel/signal.c | 2 +-
arch/powerpc/kernel/signal_64.c | 9 +
arch/powerpc/kernel/syscalls.c | 3 +-
arch/powerpc/kernel/traps.c | 18 +-
arch/powerpc/kernel/vector.S | 6 +-
arch/powerpc/kernel/vmlinux.lds.S | 10 +
arch/powerpc/kvm/book3s_hv.c | 3 +
arch/powerpc/kvm/book3s_pr.c | 2 +
arch/powerpc/lib/Makefile | 2 +-
arch/powerpc/lib/feature-fixups.c | 38 +-
arch/powerpc/lib/restart_table.c | 29 +
arch/powerpc/lib/sstep.c | 4 +-
arch/powerpc/math-emu/math.c | 2 +-
arch/powerpc/platforms/powernv/opal-call.c | 4 +
arch/powerpc/platforms/pseries/hvCall.S | 29 +
arch/powerpc/sysdev/fsl_pci.c | 2 +-
39 files changed, 1631 insertions(+), 808 deletions(-)
create mode 100644 arch/powerpc/kernel/interrupt_64.S
create mode 100644 arch/powerpc/lib/restart_table.c
--
2.23.0
More information about the Linuxppc-dev
mailing list