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


Groups > linux.kernel > #1163107 > unrolled thread

[PATCH 0/4] resend: ppc64 LE ABI v2 ftrace-with-regs implementation

Started byTorsten Duwe <duwe@lst.de>
First post2015-06-11 12:00 +0200
Last post2015-06-19 15:30 +0200
Articles 10 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [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

#1163107 — [PATCH 0/4] resend: ppc64 LE ABI v2 ftrace-with-regs implementation

FromTorsten Duwe <duwe@lst.de>
Date2015-06-11 12:00 +0200
Subject[PATCH 0/4] resend: ppc64 LE ABI v2 ftrace-with-regs implementation
Message-ID<pA7rc-1YG-11@gated-at.bofh.it>
Hi again,

with the previous submission I was too much into the details to
state a few obvious things. Now with nicer explanations and
changelog.

	Torsten

--
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/

[toc] | [next] | [standalone]


#1163110 — [PATCH 1/4] ppc64 FTRACE_WITH_REGS implementation

FromTorsten Duwe <duwe@lst.de>
Date2015-06-11 12:00 +0200
Subject[PATCH 1/4] ppc64 FTRACE_WITH_REGS implementation
Message-ID<pA7rc-1YG-15@gated-at.bofh.it>
In reply to#1163107
Implement FTRACE_WITH_REGS for powerpc64, on ELF ABI v2.
Initial work started by Vojtech Pavlik, used with permission.

  * arch/powerpc/kernel/entry_64.S:
    - enhance _mcount with a stub to test (ftrace_trace_function == &ftrace_stub)
      as suggested in Documentation/trace/ftrace-design.txt
      (for reference only, patched out at runtime)
    - Implement an effective ftrace_caller that works from within the kernel
      binary as well as from modules.
  * arch/powerpc/kernel/ftrace.c:
    - be prepared to deal with ppc64 ELV ABI v2, especially calls to _mcount
      that result from gcc -mprofile-kernel
  * arch/powerpc/kernel/module_64.c:
    - do not save the TOC pointer on the trampoline when the destination
      is ftrace_caller. This trampoline jump happens from a function prologue
      before a new stack frame is set up, so bad things may happen otherwise...
    - relax is_module_trampoline() to recognise the modified trampoline.

Signed-off-by: Torsten Duwe <duwe@suse.de>
--
 arch/powerpc/include/asm/ftrace.h |    5 +
 arch/powerpc/kernel/entry_64.S    |  112 +++++++++++++++++++++++++++++++-------
 arch/powerpc/kernel/ftrace.c      |   67 ++++++++++++++++++++--
 arch/powerpc/kernel/module_64.c   |   33 ++++++++++-
 4 files changed, 186 insertions(+), 31 deletions(-)
--
diff --git a/arch/powerpc/include/asm/ftrace.h b/arch/powerpc/include/asm/ftrace.h
index e366187..6111191 100644
--- a/arch/powerpc/include/asm/ftrace.h
+++ b/arch/powerpc/include/asm/ftrace.h
@@ -46,6 +46,8 @@
 extern void _mcount(void);
 
 #ifdef CONFIG_DYNAMIC_FTRACE
+# define FTRACE_ADDR ((unsigned long)ftrace_caller+8)
+# define FTRACE_REGS_ADDR FTRACE_ADDR
 static inline unsigned long ftrace_call_adjust(unsigned long addr)
 {
        /* reloction of mcount call site is the same as the address */
@@ -58,6 +60,9 @@ struct dyn_arch_ftrace {
 #endif /*  CONFIG_DYNAMIC_FTRACE */
 #endif /* __ASSEMBLY__ */
 
+#ifdef CONFIG_DYNAMIC_FTRACE
+#define ARCH_SUPPORTS_FTRACE_OPS 1
+#endif
 #endif
 
 #if defined(CONFIG_FTRACE_SYSCALLS) && defined(CONFIG_PPC64) && !defined(__ASSEMBLY__)
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index d180caf..a4132ef 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -1152,32 +1152,107 @@ _GLOBAL(enter_prom)
 
 #ifdef CONFIG_FUNCTION_TRACER
 #ifdef CONFIG_DYNAMIC_FTRACE
-_GLOBAL(mcount)
+
+#define TOCSAVE 24
+
 _GLOBAL(_mcount)
-	blr
+	nop // REQUIRED for ftrace, to calculate local/global entry diff
+.localentry _mcount,.-_mcount
+	mflr	r0
+	mtctr	r0
+
+	LOAD_REG_ADDR_PIC(r12,ftrace_trace_function)
+	ld	r12,0(r12)
+	LOAD_REG_ADDR_PIC(r0,ftrace_stub)
+	cmpd	r0,r12
+	ld	r0,LRSAVE(r1)
+	bne-	2f
+
+	mtlr	r0
+	bctr
+
+2:	/* here we have (*ftrace_trace_function)() in r12,
+	   "selfpc" in CTR
+	   and "frompc" in r0 */
+
+	mtlr	r0
+	bctr
+
+_GLOBAL(ftrace_caller)
+	mr	r0,r2	// global (module) call: save module TOC
+	b	1f
+.localentry ftrace_caller,.-ftrace_caller
+	mr	r0,r2	// local call: callee's TOC == our TOC
+	b	2f
+
+1:	addis	r2,r12,(.TOC.-0b)@ha
+	addi	r2,r2,(.TOC.-0b)@l
+
+2:	// Here we have our proper TOC ptr in R2,
+	// and the one we need to restore on return in r0.
+
+	ld	r12, 16(r1)	// get caller's adress
+
+	stdu	r1,-SWITCH_FRAME_SIZE(r1)
+
+	std     r12, _LINK(r1)
+	SAVE_8GPRS(0,r1)
+	std	r0,TOCSAVE(r1)
+	SAVE_8GPRS(8,r1)
+	SAVE_8GPRS(16,r1)
+	SAVE_8GPRS(24,r1)
+
+
+	LOAD_REG_IMMEDIATE(r3,function_trace_op)
+	ld	r5,0(r3)
+
+	mflr    r3
+	std     r3, _NIP(r1)
+	std	r3, 16(r1)
+	subi    r3, r3, MCOUNT_INSN_SIZE
+	mfmsr   r4
+	std     r4, _MSR(r1)
+	mfctr   r4
+	std     r4, _CTR(r1)
+	mfxer   r4
+	std     r4, _XER(r1)
+	mr	r4, r12
+	addi    r6, r1 ,STACK_FRAME_OVERHEAD
 
-_GLOBAL_TOC(ftrace_caller)
-	/* Taken from output of objdump from lib64/glibc */
-	mflr	r3
-	ld	r11, 0(r1)
-	stdu	r1, -112(r1)
-	std	r3, 128(r1)
-	ld	r4, 16(r11)
-	subi	r3, r3, MCOUNT_INSN_SIZE
 .globl ftrace_call
 ftrace_call:
 	bl	ftrace_stub
 	nop
+
+	ld	r3, _NIP(r1)
+	mtlr	r3
+
+	REST_8GPRS(0,r1)
+	REST_8GPRS(8,r1)
+	REST_8GPRS(16,r1)
+	REST_8GPRS(24,r1)
+
+	addi r1, r1, SWITCH_FRAME_SIZE
+
+	ld	r12, 16(r1)	// get caller's adress
+	mr	r2,r0		// restore callee's TOC
+	mflr	r0		// move this LR to CTR
+	mtctr	r0
+	mr	r0,r12		// restore callee's lr at _mcount site
+	mtlr	r0
+	bctr			// jump after _mcount site
+
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 .globl ftrace_graph_call
 ftrace_graph_call:
 	b	ftrace_graph_stub
 _GLOBAL(ftrace_graph_stub)
 #endif
-	ld	r0, 128(r1)
-	mtlr	r0
-	addi	r1, r1, 112
+	
 _GLOBAL(ftrace_stub)
+	nop
+	nop
+.localentry ftrace_stub,.-ftrace_stub	
 	blr
 #else
 _GLOBAL_TOC(_mcount)
@@ -1211,12 +1286,12 @@ _GLOBAL(ftrace_stub)
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
 _GLOBAL(ftrace_graph_caller)
 	/* load r4 with local address */
-	ld	r4, 128(r1)
+	ld	r4, LRSAVE+SWITCH_FRAME_SIZE(r1)
 	subi	r4, r4, MCOUNT_INSN_SIZE
 
 	/* Grab the LR out of the caller stack frame */
-	ld	r11, 112(r1)
-	ld	r3, 16(r11)
+	ld	r11, SWITCH_FRAME_SIZE(r1)
+	ld	r3, LRSAVE(r11)
 
 	bl	prepare_ftrace_return
 	nop
@@ -1228,10 +1303,7 @@ _GLOBAL(ftrace_graph_caller)
 	ld	r11, 112(r1)
 	std	r3, 16(r11)
 
-	ld	r0, 128(r1)
-	mtlr	r0
-	addi	r1, r1, 112
-	blr
+	b ftrace_graph_stub
 
 _GLOBAL(return_to_handler)
 	/* need to save return values */
diff --git a/arch/powerpc/kernel/ftrace.c b/arch/powerpc/kernel/ftrace.c
index 44d4d8e..349d07c 100644
--- a/arch/powerpc/kernel/ftrace.c
+++ b/arch/powerpc/kernel/ftrace.c
@@ -61,8 +61,11 @@ ftrace_modify_code(unsigned long ip, unsigned int old, unsigned int new)
 		return -EFAULT;
 
 	/* Make sure it is what we expect it to be */
-	if (replaced != old)
+	if (replaced != old) {
+		printk(KERN_ERR "%p: replaced (%#x) != old (%#x)",
+		(void *)ip, replaced, old);
 		return -EINVAL;
+	}
 
 	/* replace the text with the new text */
 	if (patch_instruction((unsigned int *)ip, new))
@@ -106,14 +109,16 @@ static int
 __ftrace_make_nop(struct module *mod,
 		  struct dyn_ftrace *rec, unsigned long addr)
 {
-	unsigned int op;
+	unsigned int op, op0, op1, pop;
 	unsigned long entry, ptr;
 	unsigned long ip = rec->ip;
 	void *tramp;
 
 	/* read where this goes */
-	if (probe_kernel_read(&op, (void *)ip, sizeof(int)))
+	if (probe_kernel_read(&op, (void *)ip, sizeof(int))) {
+		printk(KERN_ERR "Fetching opcode failed.\n");
 		return -EFAULT;
+	}
 
 	/* Make sure that that this is still a 24bit jump */
 	if (!is_bl_op(op)) {
@@ -158,10 +163,42 @@ __ftrace_make_nop(struct module *mod,
 	 *
 	 * Use a b +8 to jump over the load.
 	 */
-	op = 0x48000008;	/* b +8 */
 
-	if (patch_instruction((unsigned int *)ip, op))
+	pop = 0x48000008;	/* b +8 */
+
+	/*
+	 * Check what is in the next instruction. We can see ld r2,40(r1), but
+	 * on first pass after boot we will see mflr r0.
+	 */
+	if (probe_kernel_read(&op, (void *)(ip+4), MCOUNT_INSN_SIZE)) {
+		printk(KERN_ERR "Fetching op failed.\n");
+		return -EFAULT;
+	}
+
+	if (op != 0xe8410028) { /* ld r2,STACK_OFFSET(r1) */
+
+		if (probe_kernel_read(&op0, (void *)(ip-8), MCOUNT_INSN_SIZE)) {
+			printk(KERN_ERR "Fetching op0 failed.\n");
+			return -EFAULT;
+		}
+
+		if (probe_kernel_read(&op1, (void *)(ip-4), MCOUNT_INSN_SIZE)) {
+			printk(KERN_ERR "Fetching op1 failed.\n");
+			return -EFAULT;
+		}
+
+		if (op0 != 0x7c0802a6 && op1 != 0xf8010010) { /* mflr r0 ; std r0,LRSAVE(r1) */
+			printk(KERN_ERR "Unexpected instructions around bl when enabling dynamic ftrace! (%08x,%08x,bl,%08x)\n", op0, op1, op);
+			return -EINVAL;
+		}
+
+		pop = PPC_INST_NOP;	/* When using -mkernel_profile there is no load to jump over */
+	}
+
+	if (patch_instruction((unsigned int *)ip, pop)) {
+		printk(KERN_ERR "Patching NOP failed.\n");
 		return -EPERM;
+	}
 
 	return 0;
 }
@@ -287,6 +324,13 @@ int ftrace_make_nop(struct module *mod,
 
 #ifdef CONFIG_MODULES
 #ifdef CONFIG_PPC64
+#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
+int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
+                               unsigned long addr)
+{
+       return ftrace_make_call(rec, addr);
+}
+#endif
 static int
 __ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
 {
@@ -306,11 +350,18 @@ __ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
 	 * The load offset is different depending on the ABI. For simplicity
 	 * just mask it out when doing the compare.
 	 */
+#if 0 // -pg, no -mprofile-kernel
 	if ((op[0] != 0x48000008) || ((op[1] & 0xffff0000) != 0xe8410000)) {
-		pr_err("Unexpected call sequence: %x %x\n", op[0], op[1]);
+		pr_err("Unexpected call sequence at %p: %x %x\n", ip, op[0], op[1]);
 		return -EINVAL;
 	}
-
+#else
+	/* look for patched "NOP" on ppc64 with -mprofile-kernel */
+        if ((op[0] != 0x60000000) ) {
+                pr_err("Unexpected call at %p: %x\n", ip, op[0]);
+                return -EINVAL;
+        }
+#endif
 	/* If we never set up a trampoline to ftrace_caller, then bail */
 	if (!rec->arch.mod->arch.tramp) {
 		pr_err("No ftrace trampoline\n");
@@ -330,7 +381,7 @@ __ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
 
 	return 0;
 }
-#else
+#else  /* !CONFIG_PPC64: */
 static int
 __ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
 {
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c
index 6838451..1428ad8 100644
--- a/arch/powerpc/kernel/module_64.c
+++ b/arch/powerpc/kernel/module_64.c
@@ -138,12 +138,22 @@ static u32 ppc64_stub_insns[] = {
 	0x4e800420			/* bctr */
 };
 
+/* In case of _mcount calls or dynamic ftracing, Do not save the
+   current callee's TOC (in R2) again into the original caller's stack
+   frame during this trampoline hop. The stack frame already holds
+   that of the original caller.  _mcount and ftrace_caller will take
+   care of this TOC value themselves.
+*/
+#define SQUASH_TOC_SAVE_INSN(trampoline_addr) \
+	((struct ppc64_stub_entry*)(trampoline_addr))-> \
+	jump[2] = PPC_INST_NOP;
+
 #ifdef CONFIG_DYNAMIC_FTRACE
 
 static u32 ppc64_stub_mask[] = {
 	0xffff0000,
 	0xffff0000,
-	0xffffffff,
+	0x00000000,
 	0xffffffff,
 #if !defined(_CALL_ELF) || _CALL_ELF != 2
 	0xffffffff,
@@ -170,6 +180,9 @@ bool is_module_trampoline(u32 *p)
 		if ((insna & mask) != (insnb & mask))
 			return false;
 	}
+	if (insns[2] != ppc64_stub_insns[2] &&
+	    insns[2] != PPC_INST_NOP )
+		return false;
 
 	return true;
 }
@@ -475,6 +488,14 @@ static unsigned long stub_for_addr(Elf64_Shdr *sechdrs,
 static int restore_r2(u32 *instruction, struct module *me)
 {
 	if (*instruction != PPC_INST_NOP) {
+
+		/* -mprofile_kernel sequence starting with mflr r0; std r0, LRSAVE(r1) */
+		if (instruction[-3] == 0x7c0802a6 && instruction[-2] == 0xf8010010) {
+			/* Nothing to be done here, it's a _mcount call location
+			   and r2 will have to be restored in the _mcount function */
+			return 2;
+		};
+
 		pr_err("%s: Expect noop after relocate, got %08x\n",
 		       me->name, *instruction);
 		return 0;
@@ -490,7 +511,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
 		       unsigned int relsec,
 		       struct module *me)
 {
-	unsigned int i;
+	unsigned int i, r2;
 	Elf64_Rela *rela = (void *)sechdrs[relsec].sh_addr;
 	Elf64_Sym *sym;
 	unsigned long *location;
@@ -603,8 +624,11 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
 				value = stub_for_addr(sechdrs, value, me);
 				if (!value)
 					return -ENOENT;
-				if (!restore_r2((u32 *)location + 1, me))
+				if (!(r2 = restore_r2((u32 *)location + 1, me)))
 					return -ENOEXEC;
+				/* Squash the TOC saver for profiler calls */
+				if (!strcmp("_mcount", strtab+sym->st_name))
+					SQUASH_TOC_SAVE_INSN(value);
 			} else
 				value += local_entry_offset(sym);
 
@@ -665,6 +689,9 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
 	me->arch.tramp = stub_for_addr(sechdrs,
 				       (unsigned long)ftrace_caller,
 				       me);
+	/* ftrace_caller will take care of the TOC;
+	   do not clobber original caller's value. */
+	SQUASH_TOC_SAVE_INSN(me->arch.tramp);
 #endif
 
 	return 0;
--
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/

[toc] | [prev] | [next] | [standalone]


#1163115 — [PATCH 4/4] ppc64 ftrace_with_regs recursion protection

FromTorsten Duwe <duwe@lst.de>
Date2015-06-11 12:10 +0200
Subject[PATCH 4/4] ppc64 ftrace_with_regs recursion protection
Message-ID<pA7AS-2qt-7@gated-at.bofh.it>
In reply to#1163107
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/

[toc] | [prev] | [next] | [standalone]


#1163116 — [PATCH 3/4] ppc64 ftrace_with_regs: spare early boot and low level code

FromTorsten Duwe <duwe@lst.de>
Date2015-06-11 12:10 +0200
Subject[PATCH 3/4] ppc64 ftrace_with_regs: spare early boot and low level code
Message-ID<pA7AS-2qt-15@gated-at.bofh.it>
In reply to#1163107
Using -mprofile-kernel on early boot code not only confuses the checker
but is also useless, as the infrastructure is not yet in place. Proceed
like with -pg (remove it from CFLAGS), equally with time.o and ftrace itself.

  * arch/powerpc/kernel/Makefile:
    - remove -mprofile-kernel from low level and boot code objects' CFLAGS
      for FUNCTION_TRACER configurations.

Signed-off-by: Torsten Duwe <duwe@suse.de>
--
 arch/powerpc/kernel/Makefile |   12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
--
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
index 502cf69..fb33fc5 100644
--- a/arch/powerpc/kernel/Makefile
+++ b/arch/powerpc/kernel/Makefile
@@ -17,14 +17,14 @@ endif
 
 ifdef CONFIG_FUNCTION_TRACER
 # Do not trace early boot code
-CFLAGS_REMOVE_cputable.o = -pg -mno-sched-epilog
-CFLAGS_REMOVE_prom_init.o = -pg -mno-sched-epilog
-CFLAGS_REMOVE_btext.o = -pg -mno-sched-epilog
-CFLAGS_REMOVE_prom.o = -pg -mno-sched-epilog
+CFLAGS_REMOVE_cputable.o = -pg -mno-sched-epilog -mprofile-kernel
+CFLAGS_REMOVE_prom_init.o = -pg -mno-sched-epilog -mprofile-kernel
+CFLAGS_REMOVE_btext.o = -pg -mno-sched-epilog -mprofile-kernel
+CFLAGS_REMOVE_prom.o = -pg -mno-sched-epilog -mprofile-kernel
 # do not trace tracer code
-CFLAGS_REMOVE_ftrace.o = -pg -mno-sched-epilog
+CFLAGS_REMOVE_ftrace.o = -pg -mno-sched-epilog -mprofile-kernel
 # timers used by tracing
-CFLAGS_REMOVE_time.o = -pg -mno-sched-epilog
+CFLAGS_REMOVE_time.o = -pg -mno-sched-epilog -mprofile-kernel
 endif
 
 obj-y				:= cputable.o ptrace.o syscalls.o \
--
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/

[toc] | [prev] | [next] | [standalone]


#1163118 — [PATCH 2/4] ppc64 ftrace_with_regs configuration variables

FromTorsten Duwe <duwe@lst.de>
Date2015-06-11 12:10 +0200
Subject[PATCH 2/4] ppc64 ftrace_with_regs configuration variables
Message-ID<pA7AS-2qt-19@gated-at.bofh.it>
In reply to#1163107
  * Makefile:
    - globally use -mprofile-kernel in case it's configured.
  * arch/powerpc/Kconfig / kernel/trace/Kconfig:
    - declare that ppc64 HAVE_MPROFILE_KERNEL and HAVE_DYNAMIC_FTRACE_WITH_REGS,
      and use it.

Signed-off-by: Torsten Duwe <duwe@suse.de>
--
 Makefile             |    5 ++++-
 arch/powerpc/Kconfig |    2 ++
 kernel/trace/Kconfig |    5 +++++
 3 files changed, 11 insertions(+), 1 deletion(-)
--
diff --git a/Makefile b/Makefile
index 3d16bcc..bbd5e87 100644
--- a/Makefile
+++ b/Makefile
@@ -733,7 +733,10 @@ export CC_FLAGS_FTRACE
 ifdef CONFIG_HAVE_FENTRY
 CC_USING_FENTRY	:= $(call cc-option, -mfentry -DCC_USING_FENTRY)
 endif
-KBUILD_CFLAGS	+= $(CC_FLAGS_FTRACE) $(CC_USING_FENTRY)
+ifdef CONFIG_HAVE_MPROFILE_KERNEL
+CC_USING_MPROFILE_KERNEL	:= $(call cc-option, -mprofile-kernel -DCC_USING_MPROFILE_KERNEL)
+endif
+KBUILD_CFLAGS	+= $(CC_FLAGS_FTRACE) $(CC_USING_FENTRY) $(CC_USING_MPROFILE_KERNEL)
 KBUILD_AFLAGS	+= $(CC_USING_FENTRY)
 ifdef CONFIG_DYNAMIC_FTRACE
 	ifdef CONFIG_HAVE_C_RECORDMCOUNT
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 22b0940..566f204 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -94,8 +94,10 @@ config PPC
 	select OF_RESERVED_MEM
 	select HAVE_FTRACE_MCOUNT_RECORD
 	select HAVE_DYNAMIC_FTRACE
+	select HAVE_DYNAMIC_FTRACE_WITH_REGS
 	select HAVE_FUNCTION_TRACER
 	select HAVE_FUNCTION_GRAPH_TRACER
+	select HAVE_MPROFILE_KERNEL
 	select SYSCTL_EXCEPTION_TRACE
 	select ARCH_WANT_OPTIONAL_GPIOLIB
 	select VIRT_TO_BUS if !PPC64
diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig
index a5da09c..dd53f3d 100644
--- a/kernel/trace/Kconfig
+++ b/kernel/trace/Kconfig
@@ -52,6 +52,11 @@ config HAVE_FENTRY
 	help
 	  Arch supports the gcc options -pg with -mfentry
 
+config HAVE_MPROFILE_KERNEL
+	bool
+	help
+	  Arch supports the gcc options -pg with -mprofile-kernel
+
 config HAVE_C_RECORDMCOUNT
 	bool
 	help
--
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/

[toc] | [prev] | [next] | [standalone]


#1168578 — Re: [RESEND PATCH 0/4] ppc64 LE ABI v2 ftrace-with-regs implementation

FromDenis Kirjanov <kda@linux-powerpc.org>
Date2015-06-19 09:20 +0200
SubjectRe: [RESEND PATCH 0/4] ppc64 LE ABI v2 ftrace-with-regs implementation
Message-ID<pCYKK-oj-21@gated-at.bofh.it>
In reply to#1163107
On 6/18/15, Torsten Duwe <duwe@lst.de> wrote:
> Did I miss anything else? I have the notrace optimisations and
> kernel live patching in the queue, which depends on this, so I'd
> really appreciate a comment whether it is acceptable in this form
> or not. Thanks in advance!

Hi Torsten,

could you provide a description how you did test that.

Thanks.
>
> 	Torsten
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
--
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/

[toc] | [prev] | [next] | [standalone]


#1168749 — Re: [RESEND PATCH 0/4] ppc64 LE ABI v2 ftrace-with-regs implementation

FromSteven Rostedt <rostedt@goodmis.org>
Date2015-06-19 14:50 +0200
SubjectRe: [RESEND PATCH 0/4] ppc64 LE ABI v2 ftrace-with-regs implementation
Message-ID<pD3U6-7EF-11@gated-at.bofh.it>
In reply to#1168578
On Fri, 19 Jun 2015 14:17:03 +0200
Torsten Duwe <duwe@lst.de> wrote:

> On Fri, Jun 19, 2015 at 10:15:44AM +0300, Denis Kirjanov wrote:
> > 
> > Hi Torsten,
> > 
> > could you provide a description how you did test that.
> 
> Vanilla kernel, those patches on top, built as described to
> Steven in the previous mail (.config attached there, built
> natively on ppc64le ABIv2, mentioned tool versions)
> 

Great that you got it working on your machine. But you need to do it in
a way that you don't break builds of existing machines, with existing
(still supported) compilers.

-- Steve

> make vmlinux, make modules, build initrd
> qemu-system-ppc64 -no-reboot -enable-kvm -m 20480 -kernel vmlinux
>   -initrd initrd.gz -append console=hvc0 -nographic -vga none
> inside:
> cd /sys/kernel/debug/tracing
> mkdir instances/Foo
> cd instances/Foo
> echo function > current_tracer
> 
> current_tracer holds "nop" or "function"; the transition is accompanied 
> by heavy binary patching. When the function tracer is active, almost all
> calls go through ftrace_caller. This should be enough for a start; the
> proper stack frame layout details for the tracer functions still remain
> to be checked...
> 
> 	Torsten

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1168750 — Re: [RESEND PATCH 0/4] ppc64 LE ABI v2 ftrace-with-regs implementation

FromSteven Rostedt <rostedt@goodmis.org>
Date2015-06-19 14:50 +0200
SubjectRe: [RESEND PATCH 0/4] ppc64 LE ABI v2 ftrace-with-regs implementation
Message-ID<pD3U6-7EF-19@gated-at.bofh.it>
In reply to#1163107
On Fri, 19 Jun 2015 14:00:44 +0200
Torsten Duwe <duwe@lst.de> wrote:


> | kernel/bounds.c:1:0: error: -mcall-aixdesc incompatible with -mabi=elfv2
> 
> Are you building ppc64, little endian, ELF ABIv2 ?

It's big endian.

> Is your cross compiler working properly?

Well, just before applying your patches, I built and booted 4.1-rc8 on
that box. Then I applied the patches and got the error on build.

I just reverted your patches, and it builds again.

> 
> I'm compiling natively on that platform (faster for me than an x86 ;-)

x86 is bit faster for me to compile.

> | GNU assembler (GNU Binutils; SUSE Linux Enterprise 12) 2.24.0.20140403-7
> | gcc (SUSE Linux) 4.8.3 20140627 [gcc-4_8-branch revision 212064]

I'm using the cross tool chains from kernel.org

https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/4.6.3/

 powerpc64-linux-gcc (GCC) 4.6.3

> 
> 4.1.0-rc8 config attached.

Um, what do you want me to do with your config? If your patches don't
build on my box when vanilla does, it's a regression. In other words,
you broke my machine.

-- Steve

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1168769 — Re: [RESEND PATCH 0/4] ppc64 LE ABI v2 ftrace-with-regs implementation

FromTorsten Duwe <duwe@lst.de>
Date2015-06-19 15:20 +0200
SubjectRe: [RESEND PATCH 0/4] ppc64 LE ABI v2 ftrace-with-regs implementation
Message-ID<pD4n8-8sb-13@gated-at.bofh.it>
In reply to#1168750
On Fri, Jun 19, 2015 at 08:40:44AM -0400, Steven Rostedt wrote:
> On Fri, 19 Jun 2015 14:00:44 +0200
> Torsten Duwe <duwe@lst.de> wrote:
> 
> 
> > | kernel/bounds.c:1:0: error: -mcall-aixdesc incompatible with -mabi=elfv2
> > 
> > Are you building ppc64, little endian, ELF ABIv2 ?
> 
> It's big endian.

And ABIv1, consequently, and then you probably don't have .localentry.
The code inherently assumes ABIv2, v1 does not work.

I'll add a dependency on v2 then, if possible.

	Torsten

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1168775 — Re: [RESEND PATCH 1/4] ppc64 FTRACE_WITH_REGS implementation

FromSteven Rostedt <rostedt@goodmis.org>
Date2015-06-19 15:30 +0200
SubjectRe: [RESEND PATCH 1/4] ppc64 FTRACE_WITH_REGS implementation
Message-ID<pD4wO-bL-21@gated-at.bofh.it>
In reply to#1163107
On Thu, 18 Jun 2015 18:21:07 +0200
Torsten Duwe <duwe@lst.de> wrote:

> Implement FTRACE_WITH_REGS for powerpc64, on ELF ABI v2.
> Initial work started by Vojtech Pavlik, used with permission.
> 
>   * arch/powerpc/kernel/entry_64.S:
>     - enhance _mcount with a stub to test (ftrace_trace_function == &ftrace_stub)
>       as suggested in Documentation/trace/ftrace-design.txt
>       (for reference only, patched out at runtime)
>     - Implement an effective ftrace_caller that works from within the kernel
>       binary as well as from modules.
>   * arch/powerpc/kernel/ftrace.c:
>     - be prepared to deal with ppc64 ELV ABI v2, especially calls to _mcount
>       that result from gcc -mprofile-kernel
>   * arch/powerpc/kernel/module_64.c:
>     - do not save the TOC pointer on the trampoline when the destination
>       is ftrace_caller. This trampoline jump happens from a function prologue
>       before a new stack frame is set up, so bad things may happen otherwise...
>     - relax is_module_trampoline() to recognise the modified trampoline.
> 
> Signed-off-by: Torsten Duwe <duwe@suse.de>
> --

FYI, the standard notation after the change log is '---' not '--'. That
way git will chop off this from the change log. When I did a git am -s
on this patch I had:

    Signed-off-by: Torsten Duwe <duwe@suse.de>
    --
     arch/powerpc/include/asm/ftrace.h |    5 +
     arch/powerpc/kernel/entry_64.S    |  112 +++++++++++++++++++++++++++++++-------
     arch/powerpc/kernel/ftrace.c      |   67 ++++++++++++++++++++--
     arch/powerpc/kernel/module_64.c   |   33 ++++++++++-
     4 files changed, 186 insertions(+), 31 deletions(-)
    --
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

-- Steve


>  arch/powerpc/include/asm/ftrace.h |    5 +
>  arch/powerpc/kernel/entry_64.S    |  112 +++++++++++++++++++++++++++++++-------
>  arch/powerpc/kernel/ftrace.c      |   67 ++++++++++++++++++++--
>  arch/powerpc/kernel/module_64.c   |   33 ++++++++++-
>  4 files changed, 186 insertions(+), 31 deletions(-)
> --
> diff --git a/arch/powerpc/include/asm/ftrace.h b/arch/powerpc/include/asm/ftrace.h
> index e366187..6111191 100644
> --- a/arch/powerpc/include/asm/ftrace.h
> +++ b/arch/powerpc/include/asm/ftrace.h
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web