This commit introduces an option "--bpf-aux-pause" for loading BPF
program to trigger AUX pause and resume.

After:

  perf record -e cs_etm/aux-action=start-paused/ \
    
--bpf-aux-pause="kretprobe:p:__arm64_sys_openat,kprobe:r:__arm64_sys_openat,tp:r:sched:sched_switch"
 \
    -a -- ls

  perf record -e cs_etm/aux-action=start-paused/ \
    
--bpf-aux-pause="kretprobe:p:__arm64_sys_openat,kprobe:r:__arm64_sys_openat,tp:r:sched:sched_switch"
 \
    --per-thread -- ls

Signed-off-by: Leo Yan <leo....@arm.com>
---
 tools/perf/builtin-record.c | 20 +++++++++++++++++++-
 tools/perf/util/evsel.c     |  6 ++++++
 tools/perf/util/record.h    |  1 +
 3 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 
8059bce85a510b2dddc66f1b8b0013276840eddc..793609c0a59e8abcd248608f55e0af03a253138d
 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -880,7 +880,12 @@ static int record__auxtrace_init(struct record *rec)
        if (err)
                return err;
 
-       return auxtrace_parse_filters(rec->evlist);
+       err = auxtrace_parse_filters(rec->evlist);
+       if (err)
+               return err;
+
+       return auxtrace__prepare_bpf(rec->itr,
+                                    rec->opts.auxtrace_bpf_aux_pause_opts);
 }
 
 #else
@@ -2506,6 +2511,10 @@ static int __cmd_record(struct record *rec, int argc, 
const char **argv)
 
        evlist__config(rec->evlist, opts, &callchain_param);
 
+       err = auxtrace__set_bpf_filter(rec->evlist, opts);
+       if (err)
+               goto out_free_threads;
+
        /* Debug message used by test scripts */
        pr_debug3("perf record opening and mmapping events\n");
        if (record__open(rec) != 0) {
@@ -2579,6 +2588,9 @@ static int __cmd_record(struct record *rec, int argc, 
const char **argv)
        if (record__start_threads(rec))
                goto out_free_threads;
 
+       if (auxtrace__enable_bpf())
+               goto out_free_threads;
+
        /*
         * When perf is starting the traced process, all the events
         * (apart from group members) have enable_on_exec=1 set,
@@ -2907,6 +2919,7 @@ static int __cmd_record(struct record *rec, int argc, 
const char **argv)
        }
 
 out_delete_session:
+       auxtrace__cleanup_bpf();
 #ifdef HAVE_EVENTFD_SUPPORT
        if (done_fd >= 0) {
                fd = done_fd;
@@ -3629,6 +3642,11 @@ static struct option __record_options[] = {
        OPT_CALLBACK(0, "off-cpu-thresh", &record.opts, "ms",
                     "Dump off-cpu samples if off-cpu time exceeds this 
threshold (in milliseconds). (Default: 500ms)",
                     record__parse_off_cpu_thresh),
+       OPT_STRING_OPTARG(0, "bpf-aux-pause", 
&record.opts.auxtrace_bpf_aux_pause_opts,
+                         "{kprobe|kretprobe}:{p|r}:function_name\n"
+                         "\t\t\t  
{uprobe|uretprobe}:{p|r}:executable:function_name\n"
+                         "\t\t\t  {tp|tracepoint}:{p|r}:category:tracepoint\n",
+                         "Enable AUX pause with BPF backend", ""),
        OPT_END()
 };
 
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 
d55482f094bf95ac7b5c5173c1341baeb0fa9c93..f240e48f41a3e7ca5ba81733efc58a25c5c829ba
 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -2650,6 +2650,12 @@ static int evsel__open_cpu(struct evsel *evsel, struct 
perf_cpu_map *cpus,
 
                        bpf_counter__install_pe(evsel, idx, fd);
 
+                       /* Update event info into BPF map for AUX trace */
+                       if (auxtrace__update_bpf_map(evsel, idx, fd)) {
+                               err = -EINVAL;
+                               goto out_close;
+                       }
+
                        if (unlikely(test_attr__enabled())) {
                                test_attr__open(&evsel->core.attr, pid, cpu,
                                                fd, group_fd, 
evsel->open_flags);
diff --git a/tools/perf/util/record.h b/tools/perf/util/record.h
index 
ea3a6c4657eefb743dc3d54b0b791ea39117cc10..1b1c2ed7fcadae8b56408b3b1b154faef3996eb3
 100644
--- a/tools/perf/util/record.h
+++ b/tools/perf/util/record.h
@@ -65,6 +65,7 @@ struct record_opts {
        size_t        auxtrace_snapshot_size;
        const char    *auxtrace_snapshot_opts;
        const char    *auxtrace_sample_opts;
+       const char    *auxtrace_bpf_aux_pause_opts;
        bool          sample_transaction;
        bool          use_clockid;
        clockid_t     clockid;

-- 
2.34.1


Reply via email to