]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
perf arm-spe: Report error if set frequency
authorLeo Yan <leo.yan@arm.com>
Thu, 27 Feb 2025 08:55:44 +0000 (08:55 +0000)
committerNamhyung Kim <namhyung@kernel.org>
Fri, 28 Feb 2025 18:09:03 +0000 (10:09 -0800)
When users set the parameter '-F' to specify frequency for Arm SPE, the
tool reports error:

  perf record -F 1000 -e arm_spe_0// -- sleep 1
  Error:
  Invalid event (arm_spe_0//) in per-thread mode, enable system wide with '-a'.

The output logs are confused and it does not give the correct reminding.
Arm SPE does not support frequency setting given it adopts a statistical
based approach.

Alternatively, Arm SPE supports setting period.  This commit adds a
for frequency setting.  It reports error and reminds users to set period
instead.

After:

  perf record -F 1000 -e arm_spe_0// -- sleep 1
  Arm SPE: Frequency is not supported. Set period with -c option or PMU parameter (-e arm_spe_0/period=NUM/).

Signed-off-by: Leo Yan <leo.yan@arm.com>
Reviewed-by: James Clark <james.clark@linaro.org>
Link: https://lore.kernel.org/r/20250227085544.2154136-1-leo.yan@arm.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/arch/arm64/util/arm-spe.c

index 4301181b8e45050a6e5763c3e4511218b6b28b22..4f2833b62ff55f3fd1dff3f032d6e06528460939 100644 (file)
@@ -40,6 +40,19 @@ struct arm_spe_recording {
        bool                    *wrapped;
 };
 
+/* Iterate config list to detect if the "freq" parameter is set */
+static bool arm_spe_is_set_freq(struct evsel *evsel)
+{
+       struct evsel_config_term *term;
+
+       list_for_each_entry(term, &evsel->config_terms, list) {
+               if (term->type == EVSEL__CONFIG_TERM_FREQ)
+                       return true;
+       }
+
+       return false;
+}
+
 /*
  * arm_spe_find_cpus() returns a new cpu map, and the caller should invoke
  * perf_cpu_map__put() to release the map after use.
@@ -389,6 +402,14 @@ static int arm_spe_recording_options(struct auxtrace_record *itr,
                                return -EINVAL;
                        }
                        opts->full_auxtrace = true;
+
+                       if (opts->user_freq != UINT_MAX ||
+                           arm_spe_is_set_freq(evsel)) {
+                               pr_err("Arm SPE: Frequency is not supported. "
+                                      "Set period with -c option or PMU parameter (-e %s/period=NUM/).\n",
+                                      evsel->pmu->name);
+                               return -EINVAL;
+                       }
                }
        }