perf arm-spe: Remove redundant checking for "full_auxtrace"
[linux-2.6-microblaze.git] / tools / perf / arch / arm64 / util / arm-spe.c
index 414c8a5..a4420d4 100644 (file)
@@ -14,6 +14,7 @@
 #include "../../../util/cpumap.h"
 #include "../../../util/event.h"
 #include "../../../util/evsel.h"
+#include "../../../util/evsel_config.h"
 #include "../../../util/evlist.h"
 #include "../../../util/session.h"
 #include <internal/lib.h> // page_size
@@ -32,6 +33,29 @@ struct arm_spe_recording {
        struct evlist           *evlist;
 };
 
+static void arm_spe_set_timestamp(struct auxtrace_record *itr,
+                                 struct evsel *evsel)
+{
+       struct arm_spe_recording *ptr;
+       struct perf_pmu *arm_spe_pmu;
+       struct evsel_config_term *term = evsel__get_config_term(evsel, CFG_CHG);
+       u64 user_bits = 0, bit;
+
+       ptr = container_of(itr, struct arm_spe_recording, itr);
+       arm_spe_pmu = ptr->arm_spe_pmu;
+
+       if (term)
+               user_bits = term->val.cfg_chg;
+
+       bit = perf_pmu__format_bits(&arm_spe_pmu->format, "ts_enable");
+
+       /* Skip if user has set it */
+       if (bit & user_bits)
+               return;
+
+       evsel->core.attr.config |= bit;
+}
+
 static size_t
 arm_spe_info_priv_size(struct auxtrace_record *itr __maybe_unused,
                       struct evlist *evlist __maybe_unused)
@@ -68,6 +92,7 @@ static int arm_spe_recording_options(struct auxtrace_record *itr,
                        container_of(itr, struct arm_spe_recording, itr);
        struct perf_pmu *arm_spe_pmu = sper->arm_spe_pmu;
        struct evsel *evsel, *arm_spe_evsel = NULL;
+       struct perf_cpu_map *cpus = evlist->core.cpus;
        bool privileged = perf_event_paranoid_check(-1);
        struct evsel *tracking_evsel;
        int err;
@@ -91,7 +116,7 @@ static int arm_spe_recording_options(struct auxtrace_record *itr,
                return 0;
 
        /* We are in full trace mode but '-m,xyz' wasn't specified */
-       if (opts->full_auxtrace && !opts->auxtrace_mmap_pages) {
+       if (!opts->auxtrace_mmap_pages) {
                if (privileged) {
                        opts->auxtrace_mmap_pages = MiB(4) / page_size;
                } else {
@@ -120,9 +145,14 @@ static int arm_spe_recording_options(struct auxtrace_record *itr,
         */
        evlist__to_front(evlist, arm_spe_evsel);
 
-       evsel__set_sample_bit(arm_spe_evsel, CPU);
-       evsel__set_sample_bit(arm_spe_evsel, TIME);
-       evsel__set_sample_bit(arm_spe_evsel, TID);
+       /*
+        * In the case of per-cpu mmaps, sample CPU for AUX event;
+        * also enable the timestamp tracing for samples correlation.
+        */
+       if (!perf_cpu_map__empty(cpus)) {
+               evsel__set_sample_bit(arm_spe_evsel, CPU);
+               arm_spe_set_timestamp(itr, arm_spe_evsel);
+       }
 
        /* Add dummy event to keep tracking */
        err = parse_events(evlist, "dummy:u", NULL);
@@ -134,9 +164,10 @@ static int arm_spe_recording_options(struct auxtrace_record *itr,
 
        tracking_evsel->core.attr.freq = 0;
        tracking_evsel->core.attr.sample_period = 1;
-       evsel__set_sample_bit(tracking_evsel, TIME);
-       evsel__set_sample_bit(tracking_evsel, CPU);
-       evsel__reset_sample_bit(tracking_evsel, BRANCH_STACK);
+
+       /* In per-cpu case, always need the time of mmap events etc */
+       if (!perf_cpu_map__empty(cpus))
+               evsel__set_sample_bit(tracking_evsel, TIME);
 
        return 0;
 }