linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Jiri Olsa <jolsa@kernel.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
	Ingo Molnar <mingo@kernel.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Namhyung Kim <namhyung@kernel.org>,
	David Ahern <dsahern@gmail.com>, Andi Kleen <andi@firstfloor.org>
Subject: Re: [PATCH 3/4] perf tools: Add perf_evsel__read_counter function
Date: Tue, 25 Jul 2017 22:41:48 -0300	[thread overview]
Message-ID: <20170726014148.GD23846@kernel.org> (raw)
In-Reply-To: <20170721121212.21414-4-jolsa@kernel.org>

Em Fri, Jul 21, 2017 at 02:12:11PM +0200, Jiri Olsa escreveu:
> Adding perf_evsel__read_counter function to read single or
> group counter. After calling this function the counter's
> evsel::counts struct is filled with values for the counter
> and member of its group if there are any.
> 
> Link: http://lkml.kernel.org/n/tip-itsuxdyt7rp4mvij1t6k7bcl@git.kernel.org
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/perf/util/evsel.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++
>  tools/perf/util/evsel.h |   2 +
>  tools/perf/util/stat.c  |   3 ++
>  tools/perf/util/stat.h  |   5 ++-
>  4 files changed, 108 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
> index 4dd0fcc06db9..89aecf3a35c7 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -1302,6 +1302,106 @@ int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread,
>  	return 0;
>  }
>  
> +static int
> +perf_evsel__read_one(struct perf_evsel *evsel, int cpu, int thread)
> +{
> +	struct perf_counts_values *count = perf_counts(evsel->counts, cpu, thread);
> +
> +	return perf_evsel__read(evsel, cpu, thread, count);
> +}
> +
> +static void
> +perf_evsel__set_count(struct perf_evsel *counter, int cpu, int thread,
> +		      u64 val, u64 ena, u64 run)
> +{
> +	struct perf_counts_values *count;
> +
> +	count = perf_counts(counter->counts, cpu, thread);
> +
> +	count->val    = val;
> +	count->ena    = ena;
> +	count->run    = run;
> +}
> +
> +static int
> +perf_evsel__process_group_data(struct perf_evsel *leader,
> +			       int cpu, int thread, u64 *data)
> +{
> +	u64 read_format = leader->attr.read_format;
> +	struct sample_read_value *v;
> +	u64 nr, ena = 0, run = 0, i;
> +
> +	nr = *data++;
> +
> +	if (nr != (u64) leader->nr_members)
> +		return -EINVAL;
> +
> +	if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
> +		ena = *data++;
> +
> +	if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
> +		run = *data++;
> +
> +	v = (struct sample_read_value *) data;
> +
> +	perf_evsel__set_count(leader, cpu, thread,
> +			      v[0].value, ena, run);
> +
> +	for (i = 1; i < nr; i++) {
> +		struct perf_evsel *counter;
> +
> +		counter = perf_evlist__id2evsel(leader->evlist, v[i].id);
> +		if (!counter)
> +			return -EINVAL;
> +
> +		perf_evsel__set_count(counter, cpu, thread,
> +				      v[i].value, ena, run);
> +	}
> +
> +	return 0;
> +}
> +
> +static int
> +perf_evsel__read_group(struct perf_evsel *leader, int cpu, int thread)
> +{
> +	struct perf_stat_evsel *ps = leader->priv;
> +	u64 read_format = leader->attr.read_format;
> +	int size = perf_evsel__read_size(leader);
> +	u64 *data = ps->group_data;
> +
> +	if (!(read_format & PERF_FORMAT_ID))
> +		return -EINVAL;
> +
> +	if (!perf_evsel__is_group_leader(leader))
> +		return -EINVAL;
> +
> +	if (!data) {
> +		data = zalloc(size);
> +		if (!data)
> +			return -ENOMEM;
> +
> +		ps->group_data = data;
> +	}
> +
> +	if (FD(leader, cpu, thread) < 0)
> +		return -EINVAL;
> +
> +	if (readn(FD(leader, cpu, thread), data, size) <= 0)
> +		return -errno;
> +
> +	return perf_evsel__process_group_data(leader, cpu, thread, data);
> +}
> +
> +int perf_evsel__read_counter(struct perf_evsel *evsel, int cpu, int thread)
> +{
> +	u64 read_format = evsel->attr.read_format;
> +
> +	if (read_format & PERF_FORMAT_GROUP)
> +		return perf_evsel__read_group(evsel, cpu, thread);
> +	else
> +		return perf_evsel__read_one(evsel, cpu, thread);
> +}
> +
>  int __perf_evsel__read_on_cpu(struct perf_evsel *evsel,
>  			      int cpu, int thread, bool scale)
>  {
> diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
> index fb40ca3c6519..de03c18daaf0 100644
> --- a/tools/perf/util/evsel.h
> +++ b/tools/perf/util/evsel.h
> @@ -299,6 +299,8 @@ static inline bool perf_evsel__match2(struct perf_evsel *e1,
>  int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread,
>  		     struct perf_counts_values *count);
>  
> +int perf_evsel__read_counter(struct perf_evsel *evsel, int cpu, int thread);
> +
>  int __perf_evsel__read_on_cpu(struct perf_evsel *evsel,
>  			      int cpu, int thread, bool scale);
>  
> diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c
> index 53b9a994a3dc..2c258554f94d 100644
> --- a/tools/perf/util/stat.c
> +++ b/tools/perf/util/stat.c
> @@ -128,6 +128,9 @@ static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel)
>  
>  static void perf_evsel__free_stat_priv(struct perf_evsel *evsel)
>  {
> +	struct perf_stat_evsel *ps = evsel->priv;
> +
> +	free(ps->group_data);

Humm, are you sure you can always do that, i.e. that evsel->priv is not
NULL?

Program received signal SIGSEGV, Segmentation fault.
0x000000000054ca04 in perf_evsel__free_stat_priv (evsel=0x2454be0) at util/stat.c:133
133		free(ps->group_data);
Missing separate debuginfos, use: dnf debuginfo-install audit-libs-2.7.7-1.fc25.x86_64 elfutils-libelf-0.169-1.fc25.x86_64 elfutils-libs-0.169-1.fc25.x86_64 libunwind-1.2-1.fc25.x86_64 perl-libs-5.24.1-386.fc25.x86_64 python-libs-2.7.13-2.fc25.x86_64 slang-2.3.0-7.fc25.x86_64
(gdb) bt
#0  0x000000000054ca04 in perf_evsel__free_stat_priv (evsel=0x2454be0) at util/stat.c:133
#1  0x000000000054cc93 in perf_evlist__free_stats (evlist=0x24541a0) at util/stat.c:189
#2  0x0000000000460311 in cmd_script (argc=0, argv=0x7fffffffe170) at builtin-script.c:3075
#3  0x00000000004be56c in run_builtin (p=0xa359f8 <commands+408>, argc=1, argv=0x7fffffffe170) at perf.c:296
#4  0x00000000004be7d9 in handle_internal_command (argc=1, argv=0x7fffffffe170) at perf.c:348
#5  0x00000000004be92b in run_argv (argcp=0x7fffffffdfcc, argv=0x7fffffffdfc0) at perf.c:392
#6  0x00000000004bed05 in main (argc=1, argv=0x7fffffffe170) at perf.c:530
(gdb) 

I'm dropping the series, please retest with 'perf script'.

- Arnaldo

>  	zfree(&evsel->priv);
>  }
>  
> diff --git a/tools/perf/util/stat.h b/tools/perf/util/stat.h
> index 7522bf10b03e..eacaf958e19d 100644
> --- a/tools/perf/util/stat.h
> +++ b/tools/perf/util/stat.h
> @@ -28,8 +28,9 @@ enum perf_stat_evsel_id {
>  };
>  
>  struct perf_stat_evsel {
> -	struct stats		res_stats[3];
> -	enum perf_stat_evsel_id	id;
> +	struct stats		 res_stats[3];
> +	enum perf_stat_evsel_id	 id;
> +	u64			*group_data;
>  };
>  
>  enum aggr_mode {
> -- 
> 2.9.4

  reply	other threads:[~2017-07-26  1:41 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-21 12:12 [PATCH 0/4] perf stat: Enable group read of counters Jiri Olsa
2017-07-21 12:12 ` [PATCH 1/4] perf tools: Add verbose output for sys_perf_event_open fallback Jiri Olsa
2017-07-26 17:23   ` [tip:perf/core] perf evsel: " tip-bot for Jiri Olsa
2017-07-21 12:12 ` [PATCH 2/4] perf tools: Add perf_evsel__read_size function Jiri Olsa
2017-07-21 12:12 ` [PATCH 3/4] perf tools: Add perf_evsel__read_counter function Jiri Olsa
2017-07-26  1:41   ` Arnaldo Carvalho de Melo [this message]
2017-07-26  1:42     ` Arnaldo Carvalho de Melo
2017-07-26  7:30     ` Jiri Olsa
2017-07-21 12:12 ` [PATCH 4/4] perf stat: Use group read for event groups Jiri Olsa
2017-07-23  0:53   ` Namhyung Kim
2017-07-24  7:31     ` Jiri Olsa
2017-07-21 17:07 ` [PATCH 0/4] perf stat: Enable group read of counters Arnaldo Carvalho de Melo

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=20170726014148.GD23846@kernel.org \
    --to=acme@kernel.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=andi@firstfloor.org \
    --cc=dsahern@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).