Re: [PATCH v2 1/5] powerpc64/ftrace: Add a field in paca to disable ftrace in unsafe code paths
From: Naveen N. Rao <hidden>
Date: 2018-03-22 07:53:15
Naveen N. Rao wrote:
quoted hunk
We have some C code that we call into from real mode where we cannot take any exceptions. Though the C functions themselves are mostly safe, if these functions are traced, there is a possibility that we may take an exception. For instance, in certain conditions, the ftrace code uses WARN(), which uses a 'trap' to do its job. =20 For such scenarios, introduce a new field in paca 'ftrace_disabled', which is checked on ftrace entry before continuing. This field can then be set to a non-zero value to disable/pause ftrace, and reset to zero to resume ftrace. =20 Signed-off-by: Naveen N. Rao <redacted> --- Changes since v1: - Do not guard the paca field check within CONFIG_KVM. - Move the early return code out of the usual path to optimize for=20 better cache performance in the normal case when ftrace is enabled. =20 arch/powerpc/include/asm/paca.h | 1 + arch/powerpc/kernel/asm-offsets.c | 1 + arch/powerpc/kernel/trace/ftrace_64_mprofile.S | 14 ++++++++++++++ arch/powerpc/kernel/trace/ftrace_64_pg.S | 4 ++++ 4 files changed, 20 insertions(+) =20diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/p=
aca.h
quoted hunk
index d2bf71dddbef..4f47adc2a408 100644--- a/arch/powerpc/include/asm/paca.h +++ b/arch/powerpc/include/asm/paca.h@@ -211,6 +211,7 @@ struct paca_struct { u16 in_mce; u8 hmi_event_available; /* HMI event is available */ u8 hmi_p9_special_emu; /* HMI P9 special emulation */ + u8 ftrace_disabled; #endif=20 /* Stuff for accurate time accounting */diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-=
offsets.c
quoted hunk
index ea5eb91b836e..8e4fc96ff6bc 100644--- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c@@ -240,6 +240,7 @@ int main(void) OFFSET(PACA_RFI_FLUSH_FALLBACK_AREA, paca_struct, rfi_flush_fallback_ar=
ea);
quoted hunk
OFFSET(PACA_EXRFI, paca_struct, exrfi); OFFSET(PACA_L1D_FLUSH_SIZE, paca_struct, l1d_flush_size); + OFFSET(PACA_FTRACE_DISABLED, paca_struct, ftrace_disabled); =20 #endif OFFSET(PACAHWCPUID, paca_struct, hw_cpu_id);diff --git a/arch/powerpc/kernel/trace/ftrace_64_mprofile.S b/arch/powerp=
c/kernel/trace/ftrace_64_mprofile.S
quoted hunk
index 3f3e81852422..8f2380304ef1 100644--- a/arch/powerpc/kernel/trace/ftrace_64_mprofile.S +++ b/arch/powerpc/kernel/trace/ftrace_64_mprofile.S@@ -47,6 +47,12 @@ _GLOBAL(ftrace_caller) /* Save all gprs to pt_regs */ SAVE_GPR(0, r1) SAVE_10GPRS(2, r1) + + /* Ok to continue? */ + lbz r3, PACA_FTRACE_DISABLED(r13) + cmpdi r3, 0 + beq ftrace_no_trace
^^^ bne :facepalm: - Naveen =