[RFC,v1] perf evsel: Fallback to task-clock when not system wide

Message ID 20231114211254.3137289-1-irogers@google.com
State New
Headers
Series [RFC,v1] perf evsel: Fallback to task-clock when not system wide |

Commit Message

Ian Rogers Nov. 14, 2023, 9:12 p.m. UTC
  When the cycles event isn't available evsel will fallback to the
cpu-clock software event. task-clock is similar to cpu-clock but only
runs when the process is running. Falling back to cpu-clock when not
system wide leads to confusion, by falling back to task-clock it is
hoped the confusion is less.

Update a nearby comment and debug string for the change.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/util/evsel.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)
  

Comments

Namhyung Kim Nov. 17, 2023, 9:36 p.m. UTC | #1
Hi Ian,

On Tue, Nov 14, 2023 at 1:13 PM Ian Rogers <irogers@google.com> wrote:
>
> When the cycles event isn't available evsel will fallback to the
> cpu-clock software event. task-clock is similar to cpu-clock but only
> runs when the process is running. Falling back to cpu-clock when not
> system wide leads to confusion, by falling back to task-clock it is
> hoped the confusion is less.

I think they are almost the same and no meaningful difference.
The cpu-clock event also runs only when the task is running if
it's a per-task event.

>
> Update a nearby comment and debug string for the change.
>
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
>  tools/perf/util/evsel.c | 15 ++++++++-------
>  1 file changed, 8 insertions(+), 7 deletions(-)
>
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index a5da74e3a517..e1175313e4bc 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -2861,18 +2861,19 @@ bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
>             evsel->core.attr.type   == PERF_TYPE_HARDWARE &&
>             evsel->core.attr.config == PERF_COUNT_HW_CPU_CYCLES) {
>                 /*
> -                * If it's cycles then fall back to hrtimer based
> -                * cpu-clock-tick sw counter, which is always available even if
> -                * no PMU support.
> +                * If it's cycles then fall back to hrtimer based cpu-clock sw
> +                * counter, which is always available even if no PMU support.
>                  *
>                  * PPC returns ENXIO until 2.6.37 (behavior changed with commit
>                  * b0a873e).
>                  */
> -               scnprintf(msg, msgsize, "%s",
> -"The cycles event is not supported, trying to fall back to cpu-clock-ticks");
> -
>                 evsel->core.attr.type   = PERF_TYPE_SOFTWARE;
> -               evsel->core.attr.config = PERF_COUNT_SW_CPU_CLOCK;
> +               evsel->core.attr.config = evsel->core.system_wide

I'm not sure you can use the system_wide flag for this.
IIUC it's to override the target setting in some cases
(e.g. a dummy event to track sideband events in all CPUs)
and I think you need to check target__has_cpu() instead.

But as I said above, it won't make any difference in the
output.  Conceptually it'd be more natural to use task-clock
event for per-task sessions though.

Thanks,
Namhyung


> +                       ? PERF_COUNT_SW_CPU_CLOCK
> +                       : PERF_COUNT_SW_TASK_CLOCK;
> +               scnprintf(msg, msgsize,
> +                       "The cycles event is not supported, trying to fall back to %s",
> +                       evsel->core.system_wide ? "cpu-clock" : "task-clock");
>
>                 zfree(&evsel->name);
>                 return true;
> --
> 2.43.0.rc0.421.g78406f8d94-goog
>
  

Patch

diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index a5da74e3a517..e1175313e4bc 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -2861,18 +2861,19 @@  bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
 	    evsel->core.attr.type   == PERF_TYPE_HARDWARE &&
 	    evsel->core.attr.config == PERF_COUNT_HW_CPU_CYCLES) {
 		/*
-		 * If it's cycles then fall back to hrtimer based
-		 * cpu-clock-tick sw counter, which is always available even if
-		 * no PMU support.
+		 * If it's cycles then fall back to hrtimer based cpu-clock sw
+		 * counter, which is always available even if no PMU support.
 		 *
 		 * PPC returns ENXIO until 2.6.37 (behavior changed with commit
 		 * b0a873e).
 		 */
-		scnprintf(msg, msgsize, "%s",
-"The cycles event is not supported, trying to fall back to cpu-clock-ticks");
-
 		evsel->core.attr.type   = PERF_TYPE_SOFTWARE;
-		evsel->core.attr.config = PERF_COUNT_SW_CPU_CLOCK;
+		evsel->core.attr.config = evsel->core.system_wide
+			? PERF_COUNT_SW_CPU_CLOCK
+			: PERF_COUNT_SW_TASK_CLOCK;
+		scnprintf(msg, msgsize,
+			"The cycles event is not supported, trying to fall back to %s",
+			evsel->core.system_wide ? "cpu-clock" : "task-clock");
 
 		zfree(&evsel->name);
 		return true;