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

tracing: Remove redundant config HAVE_FTRACE_MCOUNT_RECORD

Ftrace is tightly coupled with architecture specific code because it
requires the use of trampolines written in assembly. This means that when
a new feature or optimization is made, it must be done for all
architectures. To simplify the approach, CONFIG_HAVE_FTRACE_* configs are
added to denote which architecture has the new enhancement so that other
architectures can still function until they too have been updated.

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.

Remove the HAVE_FTRACE_MCOUNT config and use DYNAMIC_FTRACE directly where
applicable.

Link: https://lore.kernel.org/all/20250703154916.48e3ada7@gandalf.local.home/

Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: https://lore.kernel.org/20250704104838.27a18690@gandalf.local.home
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>

+16 -47
+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
··· 107 107 select HAVE_EFFICIENT_UNALIGNED_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && MMU 108 108 select HAVE_EXIT_THREAD 109 109 select HAVE_GUP_FAST if ARM_LPAE 110 - select HAVE_FTRACE_MCOUNT_RECORD if !XIP_KERNEL 111 110 select HAVE_FUNCTION_ERROR_INJECTION 112 111 select HAVE_FUNCTION_GRAPH_TRACER 113 112 select HAVE_FUNCTION_TRACER if !XIP_KERNEL
-1
arch/arm64/Kconfig
··· 223 223 select HAVE_EFFICIENT_UNALIGNED_ACCESS 224 224 select HAVE_GUP_FAST 225 225 select HAVE_FTRACE_GRAPH_FUNC 226 - select HAVE_FTRACE_MCOUNT_RECORD 227 226 select HAVE_FUNCTION_TRACER 228 227 select HAVE_FUNCTION_ERROR_INJECTION 229 228 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
··· 144 144 select HAVE_EXIT_THREAD 145 145 select HAVE_GUP_FAST 146 146 select HAVE_FTRACE_GRAPH_FUNC 147 - select HAVE_FTRACE_MCOUNT_RECORD 148 147 select HAVE_FUNCTION_ARG_ACCESS_API 149 148 select HAVE_FUNCTION_ERROR_INJECTION 150 149 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
··· 246 246 select HAVE_EFFICIENT_UNALIGNED_ACCESS 247 247 select HAVE_GUP_FAST 248 248 select HAVE_FTRACE_GRAPH_FUNC 249 - select HAVE_FTRACE_MCOUNT_RECORD 250 249 select HAVE_FUNCTION_ARG_ACCESS_API 251 250 select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1 252 251 select HAVE_FUNCTION_ERROR_INJECTION
-1
arch/riscv/Kconfig
··· 159 159 select HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS if (DYNAMIC_FTRACE_WITH_ARGS && !CFI_CLANG) 160 160 select HAVE_DYNAMIC_FTRACE_WITH_ARGS if HAVE_DYNAMIC_FTRACE 161 161 select HAVE_FTRACE_GRAPH_FUNC 162 - select HAVE_FTRACE_MCOUNT_RECORD if !XIP_KERNEL 163 162 select HAVE_FUNCTION_GRAPH_TRACER if HAVE_DYNAMIC_FTRACE_WITH_ARGS 164 163 select HAVE_FUNCTION_GRAPH_FREGS 165 164 select HAVE_FUNCTION_TRACER if !XIP_KERNEL
-1
arch/s390/Kconfig
··· 199 199 select HAVE_GUP_FAST 200 200 select HAVE_FENTRY 201 201 select HAVE_FTRACE_GRAPH_FUNC 202 - select HAVE_FTRACE_MCOUNT_RECORD 203 202 select HAVE_FUNCTION_ARG_ACCESS_API 204 203 select HAVE_FUNCTION_ERROR_INJECTION 205 204 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
··· 244 244 select HAVE_GUP_FAST 245 245 select HAVE_FENTRY if X86_64 || DYNAMIC_FTRACE 246 246 select HAVE_FTRACE_GRAPH_FUNC if HAVE_FUNCTION_GRAPH_TRACER 247 - select HAVE_FTRACE_MCOUNT_RECORD 248 247 select HAVE_FUNCTION_GRAPH_FREGS if HAVE_FUNCTION_GRAPH_TRACER 249 248 select HAVE_FUNCTION_GRAPH_TRACER if X86_32 || (X86_64 && DYNAMIC_FTRACE) 250 249 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
··· 2639 2639 sizeof(*mod->trace_bprintk_fmt_start), 2640 2640 &mod->num_trace_bprintk_fmt); 2641 2641 #endif 2642 - #ifdef CONFIG_FTRACE_MCOUNT_RECORD 2642 + #ifdef CONFIG_DYNAMIC_FTRACE 2643 2643 /* sechdrs[0].sh_size is always zero */ 2644 2644 mod->ftrace_callsites = section_objs(info, FTRACE_CALLSITE_SECTION, 2645 2645 sizeof(*mod->ftrace_callsites),
+4 -14
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 ··· 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
-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
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;