All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Liang, Kan" <kan.liang@linux.intel.com>
To: Ian Rogers <irogers@google.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jiri Olsa <jolsa@kernel.org>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Weilin Wang <weilin.wang@intel.com>,
	James Clark <james.clark@linaro.org>, Xu Yang <xu.yang_2@nxp.com>,
	John Garry <john.g.garry@oracle.com>,
	Howard Chu <howardchu95@gmail.com>,
	Levi Yun <yeoreum.yun@arm.com>,
	Dominique Martinet <asmadeus@codewreck.org>,
	linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 10/16] perf intel-tpebs: Add support for updating counts in evsel__tpebs_read
Date: Mon, 7 Apr 2025 15:37:09 -0400	[thread overview]
Message-ID: <b7e707fb-c362-4005-9ff5-e69928732eec@linux.intel.com> (raw)
In-Reply-To: <20250407050101.1389825-11-irogers@google.com>



On 2025-04-07 1:00 a.m., Ian Rogers wrote:
> 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.
> 
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
>  tools/perf/util/evsel.c       | 11 ++------
>  tools/perf/util/intel-tpebs.c | 52 ++++++++++++++---------------------
>  tools/perf/util/intel-tpebs.h |  2 +-
>  3 files changed, 25 insertions(+), 40 deletions(-)
> 
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index 554252ed1aab..1d343f51225b 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -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);
> diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c
> index e3227646a9cc..452ce3698221 100644
> --- a/tools/perf/util/intel-tpebs.c
> +++ b/tools/perf/util/intel-tpebs.c
> @@ -415,49 +415,39 @@ int evsel__tpebs_open(struct evsel *evsel)
>  	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++;
>  	}

It seems utilizing the prev_raw_counts has been used in other place,
e.g., hwmon_pmu. Is it possible to factor out a common function for it?

Thanks,
Kan> -
> -	/*
> -	 * 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;
>  }
>  
> diff --git a/tools/perf/util/intel-tpebs.h b/tools/perf/util/intel-tpebs.h
> index 5c671181ec60..218a82866cee 100644
> --- a/tools/perf/util/intel-tpebs.h
> +++ b/tools/perf/util/intel-tpebs.h
> @@ -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 */


  reply	other threads:[~2025-04-07 19:37 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-07  5:00 [PATCH v2 00/16] Intel TPEBS min/max/mean/last support Ian Rogers
2025-04-07  5:00 ` [PATCH v2 01/16] perf intel-tpebs: Cleanup header Ian Rogers
2025-04-07  5:00 ` [PATCH v2 02/16] perf intel-tpebs: Simplify tpebs_cmd Ian Rogers
2025-04-07  5:00 ` [PATCH v2 03/16] perf intel-tpebs: Rename tpebs_start to evsel__tpebs_open Ian Rogers
2025-04-07  5:00 ` [PATCH v2 04/16] perf intel-tpebs: Separate evsel__tpebs_prepare out of evsel__tpebs_open Ian Rogers
2025-04-07  5:00 ` [PATCH v2 05/16] perf intel-tpebs: Move cpumap_buf " Ian Rogers
2025-04-07  5:00 ` [PATCH v2 06/16] perf intel-tpebs: Reduce scope of tpebs_events_size Ian Rogers
2025-04-07  5:00 ` [PATCH v2 07/16] perf intel-tpebs: Inline get_perf_record_args Ian Rogers
2025-04-07  5:00 ` [PATCH v2 08/16] perf intel-tpebs: Ensure events are opened, factor out finding Ian Rogers
2025-04-07  5:00 ` [PATCH v2 09/16] perf intel-tpebs: Refactor tpebs_results list Ian Rogers
2025-04-07 19:33   ` Liang, Kan
2025-04-07 20:03     ` Ian Rogers
2025-04-07  5:00 ` [PATCH v2 10/16] perf intel-tpebs: Add support for updating counts in evsel__tpebs_read Ian Rogers
2025-04-07 19:37   ` Liang, Kan [this message]
2025-04-07 20:07     ` Ian Rogers
2025-04-07  5:00 ` [PATCH v2 11/16] perf intel-tpebs: Add mutex for tpebs_results Ian Rogers
2025-04-07 19:49   ` Liang, Kan
2025-04-07 20:10     ` Ian Rogers
2025-04-07  5:00 ` [PATCH v2 12/16] perf intel-tpebs: Don't close record on read Ian Rogers
2025-04-07  5:00 ` [PATCH v2 13/16] perf intel-tpebs: Use stats for retirement latency statistics Ian Rogers
2025-04-07 20:39   ` kernel test robot
2025-04-07  5:00 ` [PATCH v2 14/16] perf stat: Add mean, min, max and last --tpebs-mode options Ian Rogers
2025-04-07 19:56   ` Liang, Kan
2025-04-07 20:10     ` Ian Rogers
2025-04-07  5:01 ` [PATCH v2 15/16] perf pmu-events: Add retirement latency to JSON events inside of perf Ian Rogers
2025-04-07  5:01 ` [PATCH v2 16/16] perf record: Retirement latency cleanup in evsel__config Ian Rogers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b7e707fb-c362-4005-9ff5-e69928732eec@linux.intel.com \
    --to=kan.liang@linux.intel.com \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=asmadeus@codewreck.org \
    --cc=howardchu95@gmail.com \
    --cc=irogers@google.com \
    --cc=james.clark@linaro.org \
    --cc=john.g.garry@oracle.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=weilin.wang@intel.com \
    --cc=xu.yang_2@nxp.com \
    --cc=yeoreum.yun@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.