Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1163115

[PATCH 4/4] ppc64 ftrace_with_regs recursion protection

From Torsten Duwe <duwe@lst.de>
Newsgroups linux.kernel
Subject [PATCH 4/4] ppc64 ftrace_with_regs recursion protection
Date 2015-06-11 12:10 +0200
Message-ID <pA7AS-2qt-7@gated-at.bofh.it> (permalink)
References <pA7rc-1YG-11@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


This is an *emergency* parachute to avoid an endless recursion and
consecutively a kernel stack overflow, should any function within some
ftrace framework cause an access fault, which calls _mcount / ftrace_caller
in return and so on. It might also call an ftrace'd function directly.

As Michael Ellerman pointed out, it is a tedious and error-prone task
to maintain a complete list of those functions that _might_ get called
from *_access_fault or any dynamic tracer function. So we'll
concentrate on the most frequent cases to enhance performance later,
while for now sticking with this fill-in. It will later serve as a backup
protection.

  * arch/powerpc/kernel/entry_64.S:
    - test-and-set TRACE_FTRACE_BIT in task_struct's trace_recursion,
      do not call the actual tracer function if set, clear flag on return.

Signed-off-by: Torsten Duwe <duwe@suse.de>
--
 arch/powerpc/kernel/asm-offsets.c |    1 +
 arch/powerpc/kernel/entry_64.S    |   15 +++++++++++++--
 2 files changed, 14 insertions(+), 2 deletions(-)
--
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index 4717859..ae10752 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -72,6 +72,7 @@ int main(void)
 	DEFINE(THREAD, offsetof(struct task_struct, thread));
 	DEFINE(MM, offsetof(struct task_struct, mm));
 	DEFINE(MMCONTEXTID, offsetof(struct mm_struct, context.id));
+	DEFINE(TASK_TRACEREC, offsetof(struct task_struct, trace_recursion));
 #ifdef CONFIG_PPC64
 	DEFINE(AUDITCONTEXT, offsetof(struct task_struct, audit_context));
 	DEFINE(SIGSEGV, SIGSEGV);
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index a4132ef..4768104 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -1202,7 +1202,13 @@ _GLOBAL(ftrace_caller)
 	SAVE_8GPRS(16,r1)
 	SAVE_8GPRS(24,r1)
 
-
+	ld	r3, PACACURRENT(r13)
+	ld	r4, TASK_TRACEREC(r3)
+	andi.	r5, r4, 0x0010 // ( 1 << TRACE_FTRACE_BIT )
+	ori	r4, r4, 0x0010
+	std	r4, TASK_TRACEREC(r3)
+	bne-	3f		// ftrace in progress - avoid recursion!
+	
 	LOAD_REG_IMMEDIATE(r3,function_trace_op)
 	ld	r5,0(r3)
 
@@ -1224,9 +1230,14 @@ ftrace_call:
 	bl	ftrace_stub
 	nop
 
+	ld	r3, PACACURRENT(r13)
+	ld	r4, TASK_TRACEREC(r3)
+	andi.	r4, r4, 0xffef // ~( 1 << TRACE_FTRACE_BIT )
+	std	r4, TASK_TRACEREC(r3)
+
 	ld	r3, _NIP(r1)
 	mtlr	r3
-
+3:
 	REST_8GPRS(0,r1)
 	REST_8GPRS(8,r1)
 	REST_8GPRS(16,r1)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH 0/4] resend: ppc64 LE ABI v2 ftrace-with-regs implementation Torsten Duwe <duwe@lst.de> - 2015-06-11 12:00 +0200
  [PATCH 1/4] ppc64 FTRACE_WITH_REGS implementation Torsten Duwe <duwe@lst.de> - 2015-06-11 12:00 +0200
  [PATCH 4/4] ppc64 ftrace_with_regs recursion protection Torsten Duwe <duwe@lst.de> - 2015-06-11 12:10 +0200
  [PATCH 3/4] ppc64 ftrace_with_regs: spare early boot and low level  code Torsten Duwe <duwe@lst.de> - 2015-06-11 12:10 +0200
  [PATCH 2/4] ppc64 ftrace_with_regs configuration variables Torsten Duwe <duwe@lst.de> - 2015-06-11 12:10 +0200
  Re: [RESEND PATCH 0/4] ppc64 LE ABI v2 ftrace-with-regs implementation Denis Kirjanov <kda@linux-powerpc.org> - 2015-06-19 09:20 +0200
    Re: [RESEND PATCH 0/4] ppc64 LE ABI v2 ftrace-with-regs  implementation Steven Rostedt <rostedt@goodmis.org> - 2015-06-19 14:50 +0200
  Re: [RESEND PATCH 0/4] ppc64 LE ABI v2 ftrace-with-regs  implementation Steven Rostedt <rostedt@goodmis.org> - 2015-06-19 14:50 +0200
    Re: [RESEND PATCH 0/4] ppc64 LE ABI v2 ftrace-with-regs  implementation Torsten Duwe <duwe@lst.de> - 2015-06-19 15:20 +0200
  Re: [RESEND PATCH 1/4] ppc64 FTRACE_WITH_REGS implementation Steven Rostedt <rostedt@goodmis.org> - 2015-06-19 15:30 +0200

csiph-web