public inbox for linux-trace-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* Enhancing Conditional Filtering for Function Graph Tracer
@ 2026-02-14 10:36 Donglin Peng
  2026-02-16  7:27 ` Masami Hiramatsu
  2026-02-16 15:09 ` Steven Rostedt
  0 siblings, 2 replies; 5+ messages in thread
From: Donglin Peng @ 2026-02-14 10:36 UTC (permalink / raw)
  To: Steven Rostedt, Masami Hiramatsu
  Cc: linux-trace-kernel, Linux Kernel Mailing List

Hi Steve and Masami,

I recently had an idea while using the function graph tracer.
Currently, it supports basic
filtering via set_ftrace_pid(PID-based) and
set_graph_function(function name-based).
However, this filtering mechanism feels somewhat limited. Given that
we already have
features like funcgraph-args, I wonder if we could enhance filtering by allowing
conditional tracking based on function parameters — similar to how
trace events support
filters/triggers.

To simplify implementation, I propose extending a new trigger type
(e.g., "funcgraph").
In ftrace_graph_ignore_func, we could look up the corresponding trace_fprobe and
trace_event_file based on trace->func, then decide whether to trace
the function using
a helper like the following:

static bool ftrace_graph_filter(struct trace_fprobe *tf, struct
ftrace_regs *fregs,
                               struct trace_event_file *trace_file)
{
    struct fentry_trace_entry_head *entry;
    struct trace_event_buffer fbuffer;
    struct event_trigger_data *data;
    int dsize;

    dsize = __get_data_size(&tf->tp, fregs, NULL);
    entry = trace_event_buffer_reserve(&fbuffer, trace_file,
                                       sizeof(*entry) + tf->tp.size + dsize);
    if (!entry)
        return false;

    entry = ring_buffer_event_data(fbuffer.event);
    store_trace_args(&entry[1], &tf->tp, fregs, NULL, sizeof(*entry), dsize);

    list_for_each_entry_rcu(data, &trace_file->triggers, list) {
        if (data->cmd_ops->trigger_type == TRIGGER_TYPE_FUNCGRAPH) {
            struct event_filter *filter = rcu_dereference_sched(data->filter);
            if (filter && filter_match_preds(filter, entry))
                return true; // Allow tracing
        }
    }
    return false; // Skip tracing
}

Does this approach make sense? Any suggestions or concerns?

Thanks,
Donglin

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-02-17  3:10 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-14 10:36 Enhancing Conditional Filtering for Function Graph Tracer Donglin Peng
2026-02-16  7:27 ` Masami Hiramatsu
2026-02-17  3:09   ` Donglin Peng
2026-02-16 15:09 ` Steven Rostedt
2026-02-17  3:09   ` Donglin Peng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox