]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf intel-tpebs: Add support for updating counts in evsel__tpebs_read
authorIan Rogers <irogers@google.com>
Mon, 14 Apr 2025 17:41:28 +0000 (10:41 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 25 Apr 2025 15:31:22 +0000 (12:31 -0300)
Rename to reflect evsel argument and for consistency with other tpebs
functions.

Update count from prev_raw_counts when available.

Eventually this will allow inteval mode support.

Reviewed-by: Kan Liang <kan.liang@linux.intel.com>
Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Weilin Wang <weilin.wang@intel.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexandre Torgue <alexandre.torgue@foss.st.com>
Cc: Andreas Färber <afaerber@suse.de>
Cc: Caleb Biggers <caleb.biggers@intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
Cc: Perry Taylor <perry.taylor@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Falcon <thomas.falcon@intel.com>
Link: https://lore.kernel.org/r/20250414174134.3095492-11-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/evsel.c
tools/perf/util/intel-tpebs.c
tools/perf/util/intel-tpebs.h

index c2e0ed7815b0f0f9975dd22be04f1b78457a4b88..2079ffab29f8b9e58898bd022eef95a280809d8c 100644 (file)
@@ -1718,11 +1718,6 @@ static int evsel__read_one(struct evsel *evsel, int cpu_map_idx, int thread)
        return perf_evsel__read(&evsel->core, cpu_map_idx, thread, count);
 }
 
-static int evsel__read_retire_lat(struct evsel *evsel, int cpu_map_idx, int thread)
-{
-       return tpebs_set_evsel(evsel, cpu_map_idx, thread);
-}
-
 static void evsel__set_count(struct evsel *counter, int cpu_map_idx, int thread,
                             u64 val, u64 ena, u64 run, u64 lost)
 {
@@ -1730,8 +1725,8 @@ static void evsel__set_count(struct evsel *counter, int cpu_map_idx, int thread,
 
        count = perf_counts(counter->counts, cpu_map_idx, thread);
 
-       if (counter->retire_lat) {
-               evsel__read_retire_lat(counter, cpu_map_idx, thread);
+       if (evsel__is_retire_lat(counter)) {
+               evsel__tpebs_read(counter, cpu_map_idx, thread);
                perf_counts__set_loaded(counter->counts, cpu_map_idx, thread, true);
                return;
        }
@@ -1889,7 +1884,7 @@ int evsel__read_counter(struct evsel *evsel, int cpu_map_idx, int thread)
                return evsel__hwmon_pmu_read(evsel, cpu_map_idx, thread);
 
        if (evsel__is_retire_lat(evsel))
-               return evsel__read_retire_lat(evsel, cpu_map_idx, thread);
+               return evsel__tpebs_read(evsel, cpu_map_idx, thread);
 
        if (evsel->core.attr.read_format & PERF_FORMAT_GROUP)
                return evsel__read_group(evsel, cpu_map_idx, thread);
index b48f3692c798f924cff01e4786d6076610f17303..8cbb3b3c00564bd45877ebf6a45e5cb223fed532 100644 (file)
@@ -415,49 +415,39 @@ out:
        return ret;
 }
 
-
-int tpebs_set_evsel(struct evsel *evsel, int cpu_map_idx, int thread)
+int evsel__tpebs_read(struct evsel *evsel, int cpu_map_idx, int thread)
 {
-       __u64 val;
+       struct perf_counts_values *count, *old_count = NULL;
        struct tpebs_retire_lat *t;
-       struct perf_counts_values *count;
+       uint64_t val;
+
+       /* Only set retire_latency value to the first CPU and thread. */
+       if (cpu_map_idx != 0 || thread != 0)
+               return 0;
+
+       if (evsel->prev_raw_counts)
+               old_count = perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread);
 
-       /* Non reitre_latency evsel should never enter this function. */
-       if (!evsel__is_retire_lat(evsel))
-               return -1;
+       count = perf_counts(evsel->counts, cpu_map_idx, thread);
 
        /*
         * Need to stop the forked record to ensure get sampled data from the
         * PIPE to process and get non-zero retire_lat value for hybrid.
         */
        tpebs_stop();
-       count = perf_counts(evsel->counts, cpu_map_idx, thread);
 
        t = tpebs_retire_lat__find(evsel);
-
-       /* Set ena and run to non-zero */
-       count->ena = count->run = 1;
-       count->lost = 0;
-
-       if (!t) {
-               /*
-                * Set default value or 0 when retire_latency for this event is
-                * not found from sampling data (record_tpebs not set or 0
-                * sample recorded).
-                */
-               count->val = 0;
-               return 0;
+       val = rint(t->val);
+
+       if (old_count) {
+               count->val = old_count->val + val;
+               count->run = old_count->run + 1;
+               count->ena = old_count->ena + 1;
+       } else {
+               count->val = val;
+               count->run++;
+               count->ena++;
        }
-
-       /*
-        * Only set retire_latency value to the first CPU and thread.
-        */
-       if (cpu_map_idx == 0 && thread == 0)
-               val = rint(t->val);
-       else
-               val = 0;
-
-       count->val = val;
        return 0;
 }
 
index 5c671181ec605bb1537312ed7b88d9c0929b2ab5..218a82866cee9257e9e49b6dab5af635ec71d2d2 100644 (file)
@@ -12,6 +12,6 @@ extern bool tpebs_recording;
 
 int evsel__tpebs_open(struct evsel *evsel);
 void evsel__tpebs_close(struct evsel *evsel);
-int tpebs_set_evsel(struct evsel *evsel, int cpu_map_idx, int thread);
+int evsel__tpebs_read(struct evsel *evsel, int cpu_map_idx, int thread);
 
 #endif /* __INTEL_TPEBS_H */