mirror-linux/kernel/trace
Steven Rostedt 0ae6b8ce20 ftrace: Fix accounting of subop hashes
The function graph infrastructure uses ftrace to hook to functions. It has
a single ftrace_ops to manage all the users of function graph. Each
individual user (tracing, bpf, fprobes, etc) has its own ftrace_ops to
track the functions it will have its callback called from. These
ftrace_ops are "subops" to the main ftrace_ops of the function graph
infrastructure.

Each ftrace_ops has a filter_hash and a notrace_hash that is defined as:

  Only trace functions that are in the filter_hash but not in the
  notrace_hash.

If the filter_hash is empty, it means to trace all functions.
If the notrace_hash is empty, it means do not disable any function.

The function graph main ftrace_ops needs to be a superset containing all
the functions to be traced by all the subops it has. The algorithm to
perform this merge was incorrect.

When the first subops was added to the main ops, it simply made the main
ops a copy of the subops (same filter_hash and notrace_hash).

When a second ops was added, it joined the new subops filter_hash with the
main ops filter_hash as a union of the two sets. The intersect between the
new subops notrace_hash and the main ops notrace_hash was created as the
new notrace_hash of the main ops.

The issue here is that it would then start tracing functions than no
subops were tracing. For example if you had two subops that had:

subops 1:

  filter_hash = '*sched*' # trace all functions with "sched" in it
  notrace_hash = '*time*' # except do not trace functions with "time"

subops 2:

  filter_hash = '*lock*' # trace all functions with "lock" in it
  notrace_hash = '*clock*' # except do not trace functions with "clock"

The intersect of '*time*' functions with '*clock*' functions could be the
empty set. That means the main ops will be tracing all functions with
'*time*' and all "*clock*" in it!

Instead, modify the algorithm to be a bit simpler and correct.

First, when adding a new subops, even if it's the first one, do not add
the notrace_hash if the filter_hash is not empty. Instead, just add the
functions that are in the filter_hash of the subops but not in the
notrace_hash of the subops into the main ops filter_hash. There's no
reason to add anything to the main ops notrace_hash.

The notrace_hash of the main ops should only be non empty iff all subops
filter_hashes are empty (meaning to trace all functions) and all subops
notrace_hashes include the same functions.

That is, the main ops notrace_hash is empty if any subops filter_hash is
non empty.

The main ops notrace_hash only has content in it if all subops
filter_hashes are empty, and the content are only functions that intersect
all the subops notrace_hashes. If any subops notrace_hash is empty, then
so is the main ops notrace_hash.

Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Shuah Khan <skhan@linuxfoundation.org>
Cc: Andy Chiu <andybnac@gmail.com>
Link: https://lore.kernel.org/20250409152720.216356767@goodmis.org
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
2025-04-11 16:02:08 -04:00
..
rv rv: Fix missing unlock on double nested monitors return path 2025-04-02 09:51:26 -04:00
Kconfig ftrace: Have tracing function args depend on PROBE_EVENTS_BTF_ARGS 2025-04-02 09:50:56 -04:00
Makefile
blktrace.c blktrace: remove redundant return at end of function 2024-12-23 08:17:23 -07:00
bpf_trace.c Modules changes for 6.15-rc1 2025-03-30 15:44:36 -07:00
bpf_trace.h
error_report-traces.c
fgraph.c fgraph: Correct typo in ftrace_return_to_handler comment 2025-03-04 11:15:50 -05:00
fprobe.c fprobe: Fix accounting of when to unregister from function graph 2025-02-21 09:36:12 -05:00
ftrace.c ftrace: Fix accounting of subop hashes 2025-04-11 16:02:08 -04:00
ftrace_internal.h
kprobe_event_gen_test.c
pid_list.c pid: allow pid_max to be set per pid namespace 2024-12-02 11:25:25 +01:00
pid_list.h
power-traces.c
preemptirq_delay_test.c
rethook.c
ring_buffer.c Persistent buffer cleanups and simplifications for v6.15: 2025-04-03 16:09:29 -07:00
ring_buffer_benchmark.c
rpm-traces.c
synth_event_gen_test.c
trace.c tracing: Hide get_vm_area() from MMUless builds 2025-04-07 12:02:11 -04:00
trace.h Persistent buffer cleanups and simplifications for v6.15: 2025-04-03 16:09:29 -07:00
trace_benchmark.c
trace_benchmark.h
trace_boot.c
trace_branch.c
trace_btf.c
trace_btf.h
trace_clock.c
trace_dynevent.c tracing/string: Create and use __free(argv_free) in trace_dynevent.c 2024-12-26 10:38:37 -05:00
trace_dynevent.h
trace_entries.h ftrace: Add arguments to function tracer 2025-03-04 11:27:24 -05:00
trace_eprobe.c Probes updates for v6.15: 2025-03-27 19:31:34 -07:00
trace_event_perf.c perf: Remove unnecessary parameter of security check 2025-02-26 14:13:58 -05:00
trace_events.c tracing: Verify event formats that have "%*p.." 2025-04-02 09:51:26 -04:00
trace_events_filter.c tracing: Switch trace_events_filter.c code over to use guard() 2024-12-26 10:38:37 -05:00
trace_events_filter_test.h
trace_events_hist.c tracing updates for v6.15: 2025-03-27 16:22:12 -07:00
trace_events_inject.c
trace_events_synth.c tracing: Do not add length to print format in synthetic events 2025-04-09 11:34:21 -04:00
trace_events_trigger.c tracing: Constify struct event_trigger_ops 2025-03-20 07:04:00 -04:00
trace_events_user.c tracing/user_events: Slightly simplify user_seq_show() 2025-03-06 13:35:27 -05:00
trace_export.c
trace_fprobe.c tracing: probe-events: Log error for exceeding the number of arguments 2025-03-27 21:19:54 +09:00
trace_functions.c ftrace: Add arguments to function tracer 2025-03-04 11:27:24 -05:00
trace_functions_graph.c tracing: Fix use-after-free in print_graph_function_flags during tracer switching 2025-03-22 05:42:42 -04:00
trace_hwlat.c
trace_irqsoff.c tracing: Fix use-after-free in print_graph_function_flags during tracer switching 2025-03-22 05:42:42 -04:00
trace_kdb.c trace: kdb: Replace simple_strtoul with kstrtoul in kdb_ftdump 2024-11-02 08:33:13 +00:00
trace_kprobe.c Modules changes for 6.15-rc1 2025-03-30 15:44:36 -07:00
trace_kprobe_selftest.c
trace_kprobe_selftest.h
trace_mmiotrace.c
trace_nop.c
trace_osnoise.c tracing updates for v6.15: 2025-03-27 16:22:12 -07:00
trace_output.c ring-buffer updates for v6.15 2025-03-31 13:37:22 -07:00
trace_output.h ftrace: Add print_function_args() 2025-03-04 11:27:23 -05:00
trace_preemptirq.c tracing: Fix archs that still call tracepoints without RCU watching 2024-12-05 09:28:58 -05:00
trace_printk.c
trace_probe.c tracing: probe-events: Add comments about entry data storing code 2025-03-27 21:19:54 +09:00
trace_probe.h tracing: probe-events: Log error for exceeding the number of arguments 2025-03-27 21:19:54 +09:00
trace_probe_kernel.h
trace_probe_tmpl.h tracing/fprobe: Enable fprobe events with CONFIG_DYNAMIC_FTRACE_WITH_ARGS 2024-12-26 10:50:04 -05:00
trace_recursion_record.c
trace_sched_switch.c pid: allow pid_max to be set per pid namespace 2024-12-02 11:25:25 +01:00
trace_sched_wakeup.c tracing: Fix use-after-free in print_graph_function_flags during tracer switching 2025-03-22 05:42:42 -04:00
trace_selftest.c fgraph: Pass ftrace_regs to retfunc 2024-12-26 10:50:03 -05:00
trace_selftest_dynamic.c
trace_seq.c
trace_stack.c tracing: Switch trace_stack.c code over to use guard() 2024-12-26 10:38:37 -05:00
trace_stat.c tracing: Switch trace_stat.c code over to use guard() 2024-12-26 10:38:37 -05:00
trace_stat.h
trace_synth.h
trace_syscalls.c
trace_uprobe.c tracing: probe-events: Log error for exceeding the number of arguments 2025-03-27 21:19:54 +09:00
tracing_map.c tracing: Fix cmp_entries_dup() to respect sort() comparison rules 2024-12-04 10:38:24 -05:00
tracing_map.h