Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'ftrace-v6.17' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace

Pull ftrace updates from Steven Rostedt:

- Keep track of when fgraph_ops are registered or not

Keep accounting of when fgraph_ops are registered as if a fgraph_ops
is registered twice it can mess up the accounting and it will not
work as expected later. Trigger a warning if something registers it
twice as to catch bugs before they are found by things just not
working as expected.

- Make DYNAMIC_FTRACE always enabled for architectures that support it

As static ftrace (where all functions are always traced) is very
expensive and only exists to help architectures support ftrace, do
not make it an option. As soon as an architecture supports
DYNAMIC_FTRACE make it use it. This simplifies the code.

- Remove redundant config HAVE_FTRACE_MCOUNT_RECORD

The CONFIG_HAVE_FTRACE_MCOUNT was added to help simplify the
DYNAMIC_FTRACE work, but now every architecture that implements
DYNAMIC_FTRACE also has HAVE_FTRACE_MCOUNT set too, making it
redundant with the HAVE_DYNAMIC_FTRACE.

- Make pid_ptr string size match the comment

In print_graph_proc() the pid_ptr string is of size 11, but the
comment says /* sign + log10(MAX_INT) + '\0' */ which is actually 12.

* tag 'ftrace-v6.17' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
tracing: Remove redundant config HAVE_FTRACE_MCOUNT_RECORD
ftrace: Make DYNAMIC_FTRACE always enabled for architectures that support it
fgraph: Keep track of when fgraph_ops are registered or not
fgraph: Make pid_str size match the comment

+31 -52
+4 -8
Documentation/trace/ftrace-design.rst
··· 238 238 - Tag this arch as HAVE_SYSCALL_TRACEPOINTS. 239 239 240 240 241 - HAVE_FTRACE_MCOUNT_RECORD 242 - ------------------------- 241 + HAVE_DYNAMIC_FTRACE 242 + ------------------- 243 243 244 244 See scripts/recordmcount.pl for more info. Just fill in the arch-specific 245 245 details for how to locate the addresses of mcount call sites via objdump. 246 246 This option doesn't make much sense without also implementing dynamic ftrace. 247 247 248 - 249 - HAVE_DYNAMIC_FTRACE 250 - ------------------- 251 - 252 - You will first need HAVE_FTRACE_MCOUNT_RECORD and HAVE_FUNCTION_TRACER, so 253 - scroll your reader back up if you got over eager. 248 + You will first need HAVE_FUNCTION_TRACER, so scroll your reader back up if you 249 + got over eager. 254 250 255 251 Once those are out of the way, you will need to implement: 256 252 - asm/ftrace.h:
-1
arch/arm/Kconfig
··· 105 105 select HAVE_EFFICIENT_UNALIGNED_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && MMU 106 106 select HAVE_EXIT_THREAD 107 107 select HAVE_GUP_FAST if ARM_LPAE 108 - select HAVE_FTRACE_MCOUNT_RECORD if !XIP_KERNEL 109 108 select HAVE_FUNCTION_ERROR_INJECTION 110 109 select HAVE_FUNCTION_GRAPH_TRACER 111 110 select HAVE_FUNCTION_TRACER if !XIP_KERNEL
-1
arch/arm64/Kconfig
··· 221 221 select HAVE_EFFICIENT_UNALIGNED_ACCESS 222 222 select HAVE_GUP_FAST 223 223 select HAVE_FTRACE_GRAPH_FUNC 224 - select HAVE_FTRACE_MCOUNT_RECORD 225 224 select HAVE_FUNCTION_TRACER 226 225 select HAVE_FUNCTION_ERROR_INJECTION 227 226 select HAVE_FUNCTION_GRAPH_FREGS
-1
arch/csky/Kconfig
··· 80 80 select HAVE_FUNCTION_TRACER 81 81 select HAVE_FUNCTION_GRAPH_TRACER 82 82 select HAVE_FUNCTION_ERROR_INJECTION 83 - select HAVE_FTRACE_MCOUNT_RECORD 84 83 select HAVE_KERNEL_GZIP 85 84 select HAVE_KERNEL_LZO 86 85 select HAVE_KERNEL_LZMA
-1
arch/loongarch/Kconfig
··· 143 143 select HAVE_EXIT_THREAD 144 144 select HAVE_GUP_FAST 145 145 select HAVE_FTRACE_GRAPH_FUNC 146 - select HAVE_FTRACE_MCOUNT_RECORD 147 146 select HAVE_FUNCTION_ARG_ACCESS_API 148 147 select HAVE_FUNCTION_ERROR_INJECTION 149 148 select HAVE_FUNCTION_GRAPH_FREGS
-1
arch/microblaze/Kconfig
··· 28 28 select HAVE_DEBUG_KMEMLEAK 29 29 select HAVE_DMA_CONTIGUOUS 30 30 select HAVE_DYNAMIC_FTRACE 31 - select HAVE_FTRACE_MCOUNT_RECORD 32 31 select HAVE_FUNCTION_GRAPH_TRACER 33 32 select HAVE_FUNCTION_TRACER 34 33 select HAVE_PAGE_SIZE_4KB
-1
arch/mips/Kconfig
··· 73 73 select HAVE_EBPF_JIT if !CPU_MICROMIPS 74 74 select HAVE_EXIT_THREAD 75 75 select HAVE_GUP_FAST 76 - select HAVE_FTRACE_MCOUNT_RECORD 77 76 select HAVE_FUNCTION_GRAPH_TRACER 78 77 select HAVE_FUNCTION_TRACER 79 78 select HAVE_GCC_PLUGINS
-1
arch/parisc/Kconfig
··· 81 81 select HAVE_KPROBES 82 82 select HAVE_KRETPROBES 83 83 select HAVE_DYNAMIC_FTRACE if $(cc-option,-fpatchable-function-entry=1,1) 84 - select HAVE_FTRACE_MCOUNT_RECORD if HAVE_DYNAMIC_FTRACE 85 84 select FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY if DYNAMIC_FTRACE 86 85 select HAVE_KPROBES_ON_FTRACE 87 86 select HAVE_DYNAMIC_FTRACE_WITH_REGS
-1
arch/powerpc/Kconfig
··· 244 244 select HAVE_EFFICIENT_UNALIGNED_ACCESS 245 245 select HAVE_GUP_FAST 246 246 select HAVE_FTRACE_GRAPH_FUNC 247 - select HAVE_FTRACE_MCOUNT_RECORD 248 247 select HAVE_FUNCTION_ARG_ACCESS_API 249 248 select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1 250 249 select HAVE_FUNCTION_ERROR_INJECTION
-1
arch/riscv/Kconfig
··· 157 157 select HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS if (DYNAMIC_FTRACE_WITH_ARGS && !CFI_CLANG) 158 158 select HAVE_DYNAMIC_FTRACE_WITH_ARGS if HAVE_DYNAMIC_FTRACE 159 159 select HAVE_FTRACE_GRAPH_FUNC 160 - select HAVE_FTRACE_MCOUNT_RECORD if !XIP_KERNEL 161 160 select HAVE_FUNCTION_GRAPH_TRACER if HAVE_DYNAMIC_FTRACE_WITH_ARGS 162 161 select HAVE_FUNCTION_GRAPH_FREGS 163 162 select HAVE_FUNCTION_TRACER if !XIP_KERNEL && HAVE_DYNAMIC_FTRACE
-1
arch/s390/Kconfig
··· 198 198 select HAVE_GUP_FAST 199 199 select HAVE_FENTRY 200 200 select HAVE_FTRACE_GRAPH_FUNC 201 - select HAVE_FTRACE_MCOUNT_RECORD 202 201 select HAVE_FUNCTION_ARG_ACCESS_API 203 202 select HAVE_FUNCTION_ERROR_INJECTION 204 203 select HAVE_FUNCTION_GRAPH_FREGS
-1
arch/sh/Kconfig
··· 40 40 select HAVE_GUP_FAST if MMU 41 41 select HAVE_FUNCTION_GRAPH_TRACER 42 42 select HAVE_FUNCTION_TRACER 43 - select HAVE_FTRACE_MCOUNT_RECORD 44 43 select HAVE_HW_BREAKPOINT 45 44 select HAVE_IOREMAP_PROT if MMU && !X2TLB 46 45 select HAVE_KERNEL_BZIP2
-1
arch/sparc/Kconfig
··· 78 78 select MMU_GATHER_NO_FLUSH_CACHE 79 79 select HAVE_ARCH_TRANSPARENT_HUGEPAGE 80 80 select HAVE_DYNAMIC_FTRACE 81 - select HAVE_FTRACE_MCOUNT_RECORD 82 81 select HAVE_PAGE_SIZE_8KB 83 82 select HAVE_SYSCALL_TRACEPOINTS 84 83 select HAVE_CONTEXT_TRACKING_USER
-1
arch/x86/Kconfig
··· 242 242 select HAVE_GUP_FAST 243 243 select HAVE_FENTRY if X86_64 || DYNAMIC_FTRACE 244 244 select HAVE_FTRACE_GRAPH_FUNC if HAVE_FUNCTION_GRAPH_TRACER 245 - select HAVE_FTRACE_MCOUNT_RECORD 246 245 select HAVE_FUNCTION_GRAPH_FREGS if HAVE_FUNCTION_GRAPH_TRACER 247 246 select HAVE_FUNCTION_GRAPH_TRACER if X86_32 || (X86_64 && DYNAMIC_FTRACE) 248 247 select HAVE_FUNCTION_TRACER
+1 -1
include/asm-generic/vmlinux.lds.h
··· 167 167 #define FTRACE_STUB_HACK 168 168 #endif 169 169 170 - #ifdef CONFIG_FTRACE_MCOUNT_RECORD 170 + #ifdef CONFIG_DYNAMIC_FTRACE 171 171 /* 172 172 * The ftrace call sites are logged to a section whose name depends on the 173 173 * compiler option used. A given kernel image will only use one, AKA
+1 -1
include/linux/ftrace.h
··· 1108 1108 # define trace_preempt_off(a0, a1) do { } while (0) 1109 1109 #endif 1110 1110 1111 - #ifdef CONFIG_FTRACE_MCOUNT_RECORD 1111 + #ifdef CONFIG_DYNAMIC_FTRACE 1112 1112 extern void ftrace_init(void); 1113 1113 #ifdef CC_USING_PATCHABLE_FUNCTION_ENTRY 1114 1114 #define FTRACE_CALLSITE_SECTION "__patchable_function_entries"
+3 -3
include/linux/kernel.h
··· 373 373 static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { } 374 374 #endif /* CONFIG_TRACING */ 375 375 376 - /* Rebuild everything on CONFIG_FTRACE_MCOUNT_RECORD */ 377 - #ifdef CONFIG_FTRACE_MCOUNT_RECORD 378 - # define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD 376 + /* Rebuild everything on CONFIG_DYNAMIC_FTRACE */ 377 + #ifdef CONFIG_DYNAMIC_FTRACE 378 + # define REBUILD_DUE_TO_DYNAMIC_FTRACE 379 379 #endif 380 380 381 381 /* Permissions on a sysfs file: you didn't miss the 0 prefix did you? */
+1 -1
include/linux/module.h
··· 539 539 struct trace_eval_map **trace_evals; 540 540 unsigned int num_trace_evals; 541 541 #endif 542 - #ifdef CONFIG_FTRACE_MCOUNT_RECORD 542 + #ifdef CONFIG_DYNAMIC_FTRACE 543 543 unsigned int num_ftrace_callsites; 544 544 unsigned long *ftrace_callsites; 545 545 #endif
+1 -1
kernel/module/main.c
··· 2673 2673 sizeof(*mod->trace_bprintk_fmt_start), 2674 2674 &mod->num_trace_bprintk_fmt); 2675 2675 #endif 2676 - #ifdef CONFIG_FTRACE_MCOUNT_RECORD 2676 + #ifdef CONFIG_DYNAMIC_FTRACE 2677 2677 /* sechdrs[0].sh_size is always zero */ 2678 2678 mod->ftrace_callsites = section_objs(info, FTRACE_CALLSITE_SECTION, 2679 2679 sizeof(*mod->ftrace_callsites),
+5 -15
kernel/trace/Kconfig
··· 74 74 If the architecture generates __patchable_function_entries sections 75 75 but does not want them included in the ftrace locations. 76 76 77 - config HAVE_FTRACE_MCOUNT_RECORD 78 - bool 79 - help 80 - See Documentation/trace/ftrace-design.rst 81 - 82 77 config HAVE_SYSCALL_TRACEPOINTS 83 78 bool 84 79 help ··· 270 275 funcgraph-args (for the function graph tracer) 271 276 272 277 config DYNAMIC_FTRACE 273 - bool "enable/disable function tracing dynamically" 278 + bool 274 279 depends on FUNCTION_TRACER 275 280 depends on HAVE_DYNAMIC_FTRACE 276 281 default y ··· 798 803 Allows BPF to override the execution of a probed function and 799 804 set a different return value. This is used for error injection. 800 805 801 - config FTRACE_MCOUNT_RECORD 802 - def_bool y 803 - depends on DYNAMIC_FTRACE 804 - depends on HAVE_FTRACE_MCOUNT_RECORD 805 - 806 806 config FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY 807 807 bool 808 - depends on FTRACE_MCOUNT_RECORD 808 + depends on DYNAMIC_FTRACE 809 809 810 810 config FTRACE_MCOUNT_USE_CC 811 811 def_bool y 812 812 depends on $(cc-option,-mrecord-mcount) 813 813 depends on !FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY 814 - depends on FTRACE_MCOUNT_RECORD 814 + depends on DYNAMIC_FTRACE 815 815 816 816 config FTRACE_MCOUNT_USE_OBJTOOL 817 817 def_bool y 818 818 depends on HAVE_OBJTOOL_MCOUNT 819 819 depends on !FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY 820 820 depends on !FTRACE_MCOUNT_USE_CC 821 - depends on FTRACE_MCOUNT_RECORD 821 + depends on DYNAMIC_FTRACE 822 822 select OBJTOOL 823 823 824 824 config FTRACE_MCOUNT_USE_RECORDMCOUNT ··· 821 831 depends on !FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY 822 832 depends on !FTRACE_MCOUNT_USE_CC 823 833 depends on !FTRACE_MCOUNT_USE_OBJTOOL 824 - depends on FTRACE_MCOUNT_RECORD 834 + depends on DYNAMIC_FTRACE 825 835 826 836 config TRACING_MAP 827 837 bool
+13 -3
kernel/trace/fgraph.c
··· 1325 1325 int ret = 0; 1326 1326 int i = -1; 1327 1327 1328 + if (WARN_ONCE(gops->ops.flags & FTRACE_OPS_FL_GRAPH, 1329 + "function graph ops registered again")) 1330 + return -EBUSY; 1331 + 1328 1332 guard(mutex)(&ftrace_lock); 1329 1333 1330 1334 if (!fgraph_stack_cachep) { ··· 1405 1401 { 1406 1402 int command = 0; 1407 1403 1404 + if (WARN_ONCE(!(gops->ops.flags & FTRACE_OPS_FL_GRAPH), 1405 + "function graph ops unregistered without registering")) 1406 + return; 1407 + 1408 1408 guard(mutex)(&ftrace_lock); 1409 1409 1410 1410 if (unlikely(!ftrace_graph_active)) 1411 - return; 1411 + goto out; 1412 1412 1413 1413 if (unlikely(gops->idx < 0 || gops->idx >= FGRAPH_ARRAY_SIZE || 1414 1414 fgraph_array[gops->idx] != gops)) 1415 - return; 1415 + goto out; 1416 1416 1417 1417 if (fgraph_lru_release_index(gops->idx) < 0) 1418 - return; 1418 + goto out; 1419 1419 1420 1420 fgraph_array[gops->idx] = &fgraph_stub; 1421 1421 ··· 1442 1434 unregister_trace_sched_switch(ftrace_graph_probe_sched_switch, NULL); 1443 1435 } 1444 1436 gops->saved_func = NULL; 1437 + out: 1438 + gops->ops.flags &= ~FTRACE_OPS_FL_GRAPH; 1445 1439 }
-4
kernel/trace/ftrace.c
··· 1042 1042 */ 1043 1043 static bool update_all_ops; 1044 1044 1045 - #ifndef CONFIG_FTRACE_MCOUNT_RECORD 1046 - # error Dynamic ftrace depends on MCOUNT_RECORD 1047 - #endif 1048 - 1049 1045 struct ftrace_func_probe { 1050 1046 struct ftrace_probe_ops *probe_ops; 1051 1047 struct ftrace_ops ops;
+1 -1
kernel/trace/trace_functions_graph.c
··· 513 513 { 514 514 char comm[TASK_COMM_LEN]; 515 515 /* sign + log10(MAX_INT) + '\0' */ 516 - char pid_str[11]; 516 + char pid_str[12]; 517 517 int spaces = 0; 518 518 int len; 519 519 int i;
+1 -1
scripts/recordmcount.pl
··· 359 359 $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_CKCORE_PCREL_JSR_IMM26BY2\\s+_mcount\$"; 360 360 $alignment = 2; 361 361 } else { 362 - die "Arch $arch is not supported with CONFIG_FTRACE_MCOUNT_RECORD"; 362 + die "Arch $arch is not supported with CONFIG_DYNAMIC_FTRACE"; 363 363 } 364 364 365 365 my $text_found = 0;