tracing: Minor fixes and clean ups
Subsystems (5)
Steven Rostedt
maintainercover tracing: Minor fixes and clean ups
Tracing fixes and clean ups:
- Fix some missing-prototype warnings
- Fix user events struct args (did not include size of struct) When creating a user event, the "struct" keyword is to denote that the size of the field will be passed in. But the parsing failed to handle this case.
- Fix sample code for direct trampolines.
The sample code for direct trampolines attached to handle_mm_fault(). But the prototype changed and the direct trampoline sample code was not updated. Direct trampolines needs to have the arguments correct otherwise it can fail or crash the system.
- Remove unused ftrace_regs_caller_ret() prototype.
git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
trace/core
Head SHA1: 46b77ea28faeed56f1d1b63f9049c40b9eb3cbf5
Arnd Bergmann (1):
tracing: arm64: Avoid missing-prototype warnings
Beau Belgrave (1):
tracing/user_events: Fix struct arg size match check
Florent Revest (2):
samples: ftrace: Save required argument registers in sample trampolines
arm64: ftrace: Add direct call trampoline samples support
YueHaibing (1):
x86/ftrace: Remove unsued extern declaration ftrace_regs_caller_ret()
----
arch/arm64/Kconfig | 2 ++ arch/arm64/include/asm/ftrace.h | 4 +++ arch/arm64/include/asm/syscall.h | 3 +++ arch/arm64/kernel/syscall.c | 3 --- arch/x86/kernel/ftrace.c | 1 - include/linux/ftrace.h | 8 ++++++ kernel/trace/fgraph.c | 1 + kernel/trace/ftrace_internal.h | 5 ++-- kernel/trace/trace_events_user.c | 3 +++ kernel/trace/trace_kprobe_selftest.c | 3 +++ samples/ftrace/ftrace-direct-modify.c | 34 ++++++++++++++++++++++++ samples/ftrace/ftrace-direct-multi-modify.c | 40 +++++++++++++++++++++++++++++ samples/ftrace/ftrace-direct-multi.c | 25 ++++++++++++++++++ samples/ftrace/ftrace-direct-too.c | 40 ++++++++++++++++++++++++----- samples/ftrace/ftrace-direct.c | 24 +++++++++++++++++ 15 files changed, 184 insertions(+), 12 deletions(-)
Steven Rostedt
maintainerPATCH 1/5 samples: ftrace: Save required argument registers in sample trampolines
From: Florent Revest <[email protected]>
The ftrace-direct-too sample traces the handle_mm_fault function whose signature changed since the introduction of the sample. Since:
commit bce617edecad ("mm: do page fault accounting in handle_mm_fault") handle_mm_fault now has 4 arguments. Therefore, the sample trampoline should save 4 argument registers.
s390 saves all argument registers already so it does not need a change but x86_64 needs an extra push and pop.
This also evolves the signature of the tracing function to make it mirror the signature of the traced function.
--- samples/ftrace/ftrace-direct-too.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
samples/ftrace/ftrace-direct-too.c +8 -6
@@ -5,14 +5,14 @@#include <linux/ftrace.h> #include <asm/asm-offsets.h> -extern void my_direct_func (struct vm_area_struct *vma, -unsigned long address,unsigned int flags); +extern void my_direct_func (struct vm_area_struct *vma,unsigned long address, +unsigned int flags,struct pt_regs *regs); -void my_direct_func (struct vm_area_struct *vma, -unsigned long address,unsigned int flags) +void my_direct_func (struct vm_area_struct *vma,unsigned long address, +unsigned int flags,struct pt_regs *regs) { -trace_printk ("handle mm fault vma=%p address=%lx flags=%x\n" , - vma, address, flags); +trace_printk ("handle mm fault vma=%p address=%lx flags=%x regs=%p\n" , + vma, address, flags, regs); }extern void my_tramp (void *);
@@ -34,7 +34,9 @@ asm (" pushq %rdi\n" " pushq %rsi\n" " pushq %rdx\n" +" pushq %rcx\n" " call my_direct_func\n" +" popq %rcx\n" " popq %rdx\n" " popq %rsi\n" " popq %rdi\n"
Signature · 1 line
2.40.1
Steven Rostedt
maintainerPATCH 2/5 arm64: ftrace: Add direct call trampoline samples support
In reply to Steven RostedtFrom: Florent Revest <[email protected]>
The ftrace samples need per-architecture trampoline implementations to save and restore argument registers around the calls to my_direct_func* and to restore polluted registers (eg: x30).
These samples also include <asm/asm-offsets.h> which, on arm64, is not necessary and redefines previously defined macros (resulting in warnings) so these includes are guarded by !CONFIG_ARM64.
--- arch/arm64/Kconfig | 2 ++ samples/ftrace/ftrace-direct-modify.c | 34 ++++++++++++++++++ samples/ftrace/ftrace-direct-multi-modify.c | 40 +++++++++++++++++++++ samples/ftrace/ftrace-direct-multi.c | 25 +++++++++++++ samples/ftrace/ftrace-direct-too.c | 26 ++++++++++++++ samples/ftrace/ftrace-direct.c | 24 +++++++++++++ 6 files changed, 151 insertions(+)
arch/arm64/Kconfig +2 -0
@@ -196,6 +196,8 @@ config ARM64 !CC_OPTIMIZE_FOR_SIZE) select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY \ if DYNAMIC_FTRACE_WITH_ARGS + select HAVE_SAMPLE_FTRACE_DIRECT + select HAVE_SAMPLE_FTRACE_DIRECT_MULTI select HAVE_EFFICIENT_UNALIGNED_ACCESS select HAVE_FAST_GUP select HAVE_FTRACE_MCOUNT_RECORD
samples/ftrace/ftrace-direct-modify.c +34 -0
@@ -2,7 +2,9 @@#include <linux/module.h> #include <linux/kthread.h> #include <linux/ftrace.h> +#ifndef CONFIG_ARM64 #include <asm/asm-offsets.h> +#endif extern void my_direct_func1 (void );extern void my_direct_func2 (void );
@@ -96,6 +98,38 @@ asm (#endif /* CONFIG_S390 */ +#ifdef CONFIG_ARM64 + +asm ( +" .pushsection .text, \"ax\", @progbits\n" +" .type my_tramp1, @function\n" +" .globl my_tramp1\n" +" my_tramp1:" +" bti c\n" +" sub sp, sp, #16\n" +" stp x9, x30, [sp]\n" +" bl my_direct_func1\n" +" ldp x30, x9, [sp]\n" +" add sp, sp, #16\n" +" ret x9\n" +" .size my_tramp1, .-my_tramp1\n" + +" .type my_tramp2, @function\n" +" .globl my_tramp2\n" +" my_tramp2:" +" bti c\n" +" sub sp, sp, #16\n" +" stp x9, x30, [sp]\n" +" bl my_direct_func2\n" +" ldp x30, x9, [sp]\n" +" add sp, sp, #16\n" +" ret x9\n" +" .size my_tramp2, .-my_tramp2\n" +" .popsection\n" +); + +#endif /* CONFIG_ARM64 */ +#ifdef CONFIG_LOONGARCH asm (
samples/ftrace/ftrace-direct-multi-modify.c +40 -0
@@ -2,7 +2,9 @@#include <linux/module.h> #include <linux/kthread.h> #include <linux/ftrace.h> +#ifndef CONFIG_ARM64 #include <asm/asm-offsets.h> +#endif extern void my_direct_func1 (unsigned long ip);extern void my_direct_func2 (unsigned long ip);
@@ -103,6 +105,44 @@ asm (#endif /* CONFIG_S390 */ +#ifdef CONFIG_ARM64 + +asm ( +" .pushsection .text, \"ax\", @progbits\n" +" .type my_tramp1, @function\n" +" .globl my_tramp1\n" +" my_tramp1:" +" bti c\n" +" sub sp, sp, #32\n" +" stp x9, x30, [sp]\n" +" str x0, [sp, #16]\n" +" mov x0, x30\n" +" bl my_direct_func1\n" +" ldp x30, x9, [sp]\n" +" ldr x0, [sp, #16]\n" +" add sp, sp, #32\n" +" ret x9\n" +" .size my_tramp1, .-my_tramp1\n" + +" .type my_tramp2, @function\n" +" .globl my_tramp2\n" +" my_tramp2:" +" bti c\n" +" sub sp, sp, #32\n" +" stp x9, x30, [sp]\n" +" str x0, [sp, #16]\n" +" mov x0, x30\n" +" bl my_direct_func2\n" +" ldp x30, x9, [sp]\n" +" ldr x0, [sp, #16]\n" +" add sp, sp, #32\n" +" ret x9\n" +" .size my_tramp2, .-my_tramp2\n" +" .popsection\n" +); + +#endif /* CONFIG_ARM64 */ +#ifdef CONFIG_LOONGARCH #include <asm/asm.h>
samples/ftrace/ftrace-direct-multi.c +25 -0
@@ -4,7 +4,9 @@#include <linux/mm.h> /* for handle_mm_fault() */ #include <linux/ftrace.h> #include <linux/sched/stat.h> +#ifndef CONFIG_ARM64 #include <asm/asm-offsets.h> +#endif extern void my_direct_func (unsigned long ip);
@@ -66,6 +68,29 @@ asm (#endif /* CONFIG_S390 */ +#ifdef CONFIG_ARM64 + +asm ( +" .pushsection .text, \"ax\", @progbits\n" +" .type my_tramp, @function\n" +" .globl my_tramp\n" +" my_tramp:" +" bti c\n" +" sub sp, sp, #32\n" +" stp x9, x30, [sp]\n" +" str x0, [sp, #16]\n" +" mov x0, x30\n" +" bl my_direct_func\n" +" ldp x30, x9, [sp]\n" +" ldr x0, [sp, #16]\n" +" add sp, sp, #32\n" +" ret x9\n" +" .size my_tramp, .-my_tramp\n" +" .popsection\n" +); + +#endif /* CONFIG_ARM64 */ +#ifdef CONFIG_LOONGARCH #include <asm/asm.h>
samples/ftrace/ftrace-direct-too.c +26 -0
@@ -3,7 +3,9 @@#include <linux/mm.h> /* for handle_mm_fault() */ #include <linux/ftrace.h> +#ifndef CONFIG_ARM64 #include <asm/asm-offsets.h> +#endif extern void my_direct_func (struct vm_area_struct *vma,unsigned long address,unsigned int flags,struct pt_regs *regs);
@@ -72,6 +74,30 @@ asm (#endif /* CONFIG_S390 */ +#ifdef CONFIG_ARM64 + +asm ( +" .pushsection .text, \"ax\", @progbits\n" +" .type my_tramp, @function\n" +" .globl my_tramp\n" +" my_tramp:" +" bti c\n" +" sub sp, sp, #48\n" +" stp x9, x30, [sp]\n" +" stp x0, x1, [sp, #16]\n" +" stp x2, x3, [sp, #32]\n" +" bl my_direct_func\n" +" ldp x30, x9, [sp]\n" +" ldp x0, x1, [sp, #16]\n" +" ldp x2, x3, [sp, #32]\n" +" add sp, sp, #48\n" +" ret x9\n" +" .size my_tramp, .-my_tramp\n" +" .popsection\n" +); + +#endif /* CONFIG_ARM64 */ +#ifdef CONFIG_LOONGARCH asm (
samples/ftrace/ftrace-direct.c +24 -0
@@ -3,7 +3,9 @@#include <linux/sched.h> /* for wake_up_process() */ #include <linux/ftrace.h> +#ifndef CONFIG_ARM64 #include <asm/asm-offsets.h> +#endif extern void my_direct_func (struct task_struct *p);
@@ -63,6 +65,28 @@ asm (#endif /* CONFIG_S390 */ +#ifdef CONFIG_ARM64 + +asm ( +" .pushsection .text, \"ax\", @progbits\n" +" .type my_tramp, @function\n" +" .globl my_tramp\n" +" my_tramp:" +" bti c\n" +" sub sp, sp, #32\n" +" stp x9, x30, [sp]\n" +" str x0, [sp, #16]\n" +" bl my_direct_func\n" +" ldp x30, x9, [sp]\n" +" ldr x0, [sp, #16]\n" +" add sp, sp, #32\n" +" ret x9\n" +" .size my_tramp, .-my_tramp\n" +" .popsection\n" +); + +#endif /* CONFIG_ARM64 */ +#ifdef CONFIG_LOONGARCH asm (
Signature · 1 line
2.40.1
Steven Rostedt
maintainerPATCH 3/5 x86/ftrace: Remove unsued extern declaration ftrace_regs_caller_ret()
In reply to Steven RostedtFrom: YueHaibing <[email protected]>
This is now unused, so can remove it.
--- arch/x86/kernel/ftrace.c | 1 - 1 file changed, 1 deletion(-)
arch/x86/kernel/ftrace.c +0 -1
@@ -282,7 +282,6 @@ static inline void tramp_free(void *tramp) { }/* Defined as markers to the end of the ftrace default trampolines */ extern void ftrace_regs_caller_end (void ); -extern void ftrace_regs_caller_ret (void );extern void ftrace_caller_end (void );extern void ftrace_caller_op_ptr (void );extern void ftrace_regs_caller_op_ptr (void );
Signature · 1 line
2.40.1
Steven Rostedt
maintainerPATCH 4/5 tracing: arm64: Avoid missing-prototype warnings
In reply to Steven RostedtFrom: Arnd Bergmann <[email protected]>
These are all tracing W=1 warnings in arm64 allmodconfig about missing prototypes:
kernel/trace/trace_kprobe_selftest.c:7:5: error: no previous prototype for 'kprobe_trace_selftest_target' [-Werror=missing-pro totypes]kernel/trace/ftrace.c:329:5: error: no previous prototype for '__register_ftrace_function' [-Werror=missing-prototypes] kernel/trace/ftrace.c:372:5: error: no previous prototype for '__unregister_ftrace_function' [-Werror=missing-prototypes] kernel/trace/ftrace.c:4130:15: error: no previous prototype for 'arch_ftrace_match_adjust' [-Werror=missing-prototypes] kernel/trace/fgraph.c:243:15: error: no previous prototype for 'ftrace_return_to_handler' [-Werror=missing-prototypes] kernel/trace/fgraph.c:358:6: error: no previous prototype for 'ftrace_graph_sleep_time_control' [-Werror=missing-prototypes] arch/arm64/kernel/ftrace.c:460:6: error: no previous prototype for 'prepare_ftrace_return' [-Werror=missing-prototypes] arch/arm64/kernel/ptrace.c:2172:5: error: no previous prototype for 'syscall_trace_enter' [-Werror=missing-prototypes] arch/arm64/kernel/ptrace.c:2195:6: error: no previous prototype for 'syscall_trace_exit' [-Werror=missing-prototypes]
Move the declarations to an appropriate header where they can be seen by the caller and callee, and make sure the headers are included where needed.
--- arch/arm64/include/asm/ftrace.h | 4 ++++ arch/arm64/include/asm/syscall.h | 3 +++ arch/arm64/kernel/syscall.c | 3 --- include/linux/ftrace.h | 8 ++++++++ kernel/trace/fgraph.c | 1 + kernel/trace/ftrace_internal.h | 5 +++-- kernel/trace/trace_kprobe_selftest.c | 3 +++ 7 files changed, 22 insertions(+), 5 deletions(-)
arch/arm64/include/asm/ftrace.h +4 -0
@@ -211,6 +211,10 @@ static inline unsigned long fgraph_ret_regs_frame_pointer(struct fgraph_ret_regs {return ret_regs->fp; } + +void prepare_ftrace_return (unsigned long self_addr,unsigned long *parent, +unsigned long frame_pointer); +#endif /* ifdef CONFIG_FUNCTION_GRAPH_TRACER */ #endif
arch/arm64/include/asm/syscall.h +3 -0
@@ -85,4 +85,7 @@ static inline int syscall_get_arch(struct task_struct *task) return AUDIT_ARCH_AARCH64; } +int syscall_trace_enter (struct pt_regs *regs); +void syscall_trace_exit (struct pt_regs *regs); +#endif /* __ASM_SYSCALL_H */
arch/arm64/kernel/syscall.c +0 -3
@@ -75,9 +75,6 @@ static inline bool has_syscall_work(unsigned long flags)return unlikely (flags & _TIF_SYSCALL_WORK); } -int syscall_trace_enter (struct pt_regs *regs); -void syscall_trace_exit (struct pt_regs *regs); -static void el0_svc_common (struct pt_regs *regs,int scno,int sc_nr,const syscall_fn_t syscall_table[]) {
include/linux/ftrace.h +8 -0
@@ -41,6 +41,14 @@ struct ftrace_ops;struct ftrace_regs ;struct dyn_ftrace ; +char *arch_ftrace_match_adjust (char *str,const char *search); + +#ifdef CONFIG_HAVE_FUNCTION_GRAPH_RETVAL +unsigned long ftrace_return_to_handler (struct fgraph_ret_regs *ret_regs); +#else +unsigned long ftrace_return_to_handler (unsigned long frame_pointer); +#endif +#ifdef CONFIG_FUNCTION_TRACER /* * If the arch's mcount caller does not support all of ftrace's
kernel/trace/fgraph.c +1 -0
@@ -15,6 +15,7 @@#include <trace/events/sched.h> #include "ftrace_internal.h" +#include "trace.h" #ifdef CONFIG_DYNAMIC_FTRACE #define ASSIGN_OPS_HASH (opsname, val) \
kernel/trace/ftrace_internal.h +3 -2
@@ -2,6 +2,9 @@#ifndef _LINUX_KERNEL_FTRACE_INTERNAL_H#define _LINUX_KERNEL_FTRACE_INTERNAL_H +int __register_ftrace_function (struct ftrace_ops *ops); +int __unregister_ftrace_function (struct ftrace_ops *ops); +#ifdef CONFIG_FUNCTION_TRACER extern struct mutex ftrace_lock;
@@ -15,8 +18,6 @@ int ftrace_ops_test(struct ftrace_ops *ops, unsigned long ip, void *regs);#else /* !CONFIG_DYNAMIC_FTRACE */ -int __register_ftrace_function (struct ftrace_ops *ops); -int __unregister_ftrace_function (struct ftrace_ops *ops);/* Keep as macros so we do not need to define the commands */ # define ftrace_startup (ops, command) \ ({ \
kernel/trace/trace_kprobe_selftest.c +3 -0
@@ -1,4 +1,7 @@// SPDX-License-Identifier: GPL-2.0 + +#include "trace_kprobe_selftest.h" +/* * Function used during the kprobe self test. This function is in a separate * compile unit so it can be compile with CC_FLAGS_FTRACE to ensure that it
Signature · 1 line
2.40.1
Steven Rostedt
maintainerPATCH 5/5 tracing/user_events: Fix struct arg size match check
In reply to Steven RostedtFrom: Beau Belgrave <[email protected]>
When users register an event the name of the event and it's argument are checked to ensure they match if the event already exists. Normally all arguments are in the form of "type name", except for when the type starts with "struct ". In those cases, the size of the struct is passed in addition to the name, IE: "struct my_struct a 20" for an argument that is of type "struct my_struct" with a field name of "a" and has the size of 20 bytes.
The current code does not honor the above case properly when comparing a match. This causes the event register to fail even when the same string was used for events that contain a struct argument within them. The example above "struct my_struct a 20" generates a match string of "struct my_struct a" omitting the size field.
Add the struct size of the existing field when generating a comparison string for a struct field to ensure proper match checking.
--- kernel/trace/trace_events_user.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/trace/trace_events_user.c +3 -0
@@ -1223,6 +1223,9 @@ static int user_field_set_string(struct ftrace_event_field *field, pos +=snprintf (buf + pos,LEN_OR_ZERO ," " ); pos +=snprintf (buf + pos,LEN_OR_ZERO ,"%s" , field->name); +if (str_has_prefix (field->type,"struct " )) + pos +=snprintf (buf + pos,LEN_OR_ZERO ," %d" , field->size); +if (colon) pos +=snprintf (buf + pos,LEN_OR_ZERO ,";" );
Signature · 1 line
2.40.1