powerpc/powernv: move OPAL call wrapper tracing and interrupt handling to C
Nicholas Piggin
reviewerRFC PATCH 1/1 powerpc/powernv: move OPAL call wrapper tracing and interrupt handling to C
The OPAL call wrapper gets interrupt disabling wrong. It disables interrupts just by clearing MSR[EE], which has two problems:
- It doesn't call into the IRQ tracing subsystem, which means tracing across OPAL calls does not always notice IRQs have been disabled.
- It doesn't go through the IRQ soft-mask code, which causes a minor bug. MSR[EE] can not be restored by saving the MSR then clearing MSR[EE], because a racing interrupt while soft-masked because a masked interrupt could race and clear MSR[EE] between the two steps. This can cause MSR[EE] to be incorrectly enabled when the OPAL call returns. Fortunately that should just take an interrupt and re-run the masked handler to fix things, but it's sloppy.
The wapper also saves MSR to PACA, which is not re-entrant if the nested MSRs does not match, which could be a problem if a SRESET interrupts a real-mode call, for example.
To fix this, move the tracing and IRQ handling code to C, and call into asm when everything is ready to go. Save MSR on stack.
Performance cost is kept to a minimum with a few optimisations,
- The endian switch upon return is combined with the MSR restore, which avoids an expensive context synchronizing operation for LE kernels. This makes up for the additional mtmsrd to enable interrupts with local_irq_enable().
- The bl/blr branches are balanced to avoid link stack corruption and reduce mispredicts. This requires a skiboot link stack fix as well.
Even so, a NULL call goes from 410ns to 430ns (POWER9) after this. I would have expected it to come out much closer or even a little ahead, can't see why it's ~70 cycles slower. Might have to do some trace analysis.
--- arch/powerpc/include/asm/asm-prototypes.h | 10 +- arch/powerpc/platforms/powernv/Makefile | 5 +- arch/powerpc/platforms/powernv/opal-call.c | 277 ++++++++++++++ .../platforms/powernv/opal-tracepoints.c | 88 ----- .../powerpc/platforms/powernv/opal-wrappers.S | 344 ++---------------- 5 files changed, 322 insertions(+), 402 deletions(-) create mode 100644 arch/powerpc/platforms/powernv/opal-call.c delete mode 100644 arch/powerpc/platforms/powernv/opal-tracepoints.c
arch/powerpc/include/asm/asm-prototypes.h +4 -6
@@ -37,13 +37,11 @@ void kexec_copy_flush(struct kimage *image);extern struct static_key hcall_tracepoint_key;void __trace_hcall_entry (unsigned long opcode,unsigned long *args);void __trace_hcall_exit (long opcode,long retval,unsigned long *retbuf); -/* OPAL tracing */ -#ifdef HAVE_JUMP_LABEL -extern struct static_key opal_tracepoint_key; -#endif -void __trace_opal_entry (unsigned long opcode,unsigned long *args); -void __trace_opal_exit (long opcode,unsigned long retval); +/* OPAL */ +int64_t __opal_call (int64_t a0,int64_t a1,int64_t a2,int64_t a3, +int64_t a4,int64_t a5,int64_t a6,int64_t a7, +int64_t opcode,uint64_t msr);/* VMX copying */ int enter_vmx_usercopy (void );
arch/powerpc/platforms/powernv/Makefile +2 -3
@@ -1,6 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 -obj-y += setup.o opal-wrappers.o opal.o opal-async.o idle.o -obj-y += opal-rtc.o opal-nvram.o opal-lpc.o opal-flash.o +obj-y += setup.o opal-call.o opal-wrappers.o opal.o opal-async.o +obj-y += idle.o opal-rtc.o opal-nvram.o opal-lpc.o opal-flash.o obj-y += rng.o opal-elog.o opal-dump.o opal-sysparam.o opal-sensor.o obj-y += opal-msglog.o opal-hmi.o opal-power.o opal-irqchip.o obj-y += opal-kmsg.o opal-powercap.o opal-psr.o opal-sensor-groups.o
@@ -11,7 +11,6 @@ obj-$(CONFIG_CXL_BASE) += pci-cxl.o obj-$(CONFIG_EEH) += eeh-powernv.o obj-$(CONFIG_PPC_SCOM) += opal-xscom.o obj-$(CONFIG_MEMORY_FAILURE) += opal-memory-errors.o -obj-$(CONFIG_TRACEPOINTS) += opal-tracepoints.o obj-$(CONFIG_OPAL_PRD) += opal-prd.o obj-$(CONFIG_PERF_EVENTS) += opal-imc.o obj-$(CONFIG_PPC_MEMTRACE) += memtrace.o
arch/powerpc/platforms/powernv/opal-call.c new file +277 -0
277 lines not on this page · raw message
arch/powerpc/platforms/powernv/opal-tracepoints.c deleted +0 -88
88 lines not on this page · raw message
arch/powerpc/platforms/powernv/opal-wrappers.S +39 -305
356 lines not on this page · raw message
Signature · 1 line
2.18.0