All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: kan.liang@intel.com
Cc: jolsa@kernel.org, a.p.zijlstra@chello.nl, luto@kernel.org,
	mingo@redhat.com, eranian@google.com, ak@linux.intel.com,
	mark.rutland@arm.com, adrian.hunter@intel.com,
	namhyung@kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH V9 4/6] perf,tools: Dump per-sample freq/CPU%/CORE_BUSY% in report -D
Date: Thu, 10 Sep 2015 11:21:26 -0300	[thread overview]
Message-ID: <20150910142126.GC23511@kernel.org> (raw)
In-Reply-To: <1441740769-61236-5-git-send-email-kan.liang@intel.com>

Em Tue, Sep 08, 2015 at 03:32:47PM -0400, kan.liang@intel.com escreveu:
> From: Kan Liang <kan.liang@intel.com>
> 
> The group read results from cycles/ref-cycles/TSC/ASTATE/MSTATE event
> can be used to calculate the frequency, CPU Utilization and percent
> performance during each sampling period.
> This patch shows them in report -D.
> 
> Here is an example:
> 
> $ perf record --freq-perf  ~/tchain_edit
> 
> Here is one sample from perf report -D
> 
> 1972044565107 0x3498 [0x88]: PERF_RECORD_SAMPLE(IP, 0x2): 10608/10608:
> 0x4005fd period: 564686 addr: 0
> ... sample_read:
> .... group nr 5
> ..... id 0000000000000012, value 0000000002143901
> ..... id 0000000000000052, value 0000000002143896
> ..... id 0000000000000094, value 00000000021e443d
> ..... id 00000000000000d4, value 00000000021db984
> ..... id 0000000000000114, value 00000000021db964
> ..... Freq 2301 MHz
> ..... CPU% 98%
> ..... CORE_BUSY% 99%
> 
> Signed-off-by: Kan Liang <kan.liang@intel.com>
> Acked-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/perf/util/session.c | 28 +++++++++++++++++++++---
>  tools/perf/util/session.h | 54 +++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 79 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 23fed17..ba763f7 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -7,7 +7,6 @@
>  #include <sys/mman.h>
>  
>  #include "evlist.h"
> -#include "evsel.h"
>  #include "session.h"
>  #include "tool.h"
>  #include "sort.h"
> @@ -878,8 +877,15 @@ static void perf_evlist__print_tstamp(struct perf_evlist *evlist,
>  		printf("%" PRIu64 " ", sample->time);
>  }
>  
> -static void sample_read__printf(struct perf_sample *sample, u64 read_format)
> +static void sample_read__printf(struct perf_sample *sample,
> +				struct perf_evsel *evsel)

Hey, this is a _printf_ function, i.e. one thinks about functions with
such name it doing just that, printing whatever is _already_ in the data
structures, at maximum messing with _output_ related internal state.

This probably needs setting up at some other place, so that when it
comes here it is already all worked out.

- Arnaldo

>  {
> +	u64 read_format = evsel->attr.read_format;
> +	struct perf_evlist *evlist = evsel->evlist;
> +	struct perf_sample_id *sid;
> +	perf_freq_t data = { 0 };
> +	u64 cpu_max_freq = evlist->env->cpuattr.max_freq;
> +
>  	printf("... sample_read:\n");
>  
>  	if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
> @@ -902,10 +908,26 @@ static void sample_read__printf(struct perf_sample *sample, u64 read_format)
>  			printf("..... id %016" PRIx64
>  			       ", value %016" PRIx64 "\n",
>  			       value->id, value->value);
> +
> +			sid = perf_evlist__id2sid(evlist, value->id);
> +			evsel = sid->evsel;
> +			if (evsel != NULL)
> +				perf_freq__init(evlist->env->msr_pmu_type,
> +						evsel, data, value->value);
>  		}
>  	} else
>  		printf("..... id %016" PRIx64 ", value %016" PRIx64 "\n",
>  			sample->read.one.id, sample->read.one.value);
> +
> +	if (perf_freq__has_freq(data))
> +		printf("..... Freq %lu MHz\n",
> +		       perf_freq__get_freq(data, cpu_max_freq/1000));
> +	if (perf_freq__has_cpu_util(data))
> +		printf("..... CPU%% %lu%%\n",
> +		       perf_freq__get_cpu_util(data));
> +	if (perf_freq__has_core_busy(data))
> +		printf("..... CORE_BUSY%% %lu%%\n",
> +		       perf_freq__get_core_busy(data));
>  }
>  
>  static void dump_event(struct perf_evlist *evlist, union perf_event *event,
> @@ -965,7 +987,7 @@ static void dump_sample(struct perf_evsel *evsel, union perf_event *event,
>  		printf("... transaction: %" PRIx64 "\n", sample->transaction);
>  
>  	if (sample_type & PERF_SAMPLE_READ)
> -		sample_read__printf(sample, evsel->attr.read_format);
> +		sample_read__printf(sample, evsel);
>  }
>  
>  static struct machine *machines__find_for_cpumode(struct machines *machines,
> diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
> index 3915be7..83bf4a9 100644
> --- a/tools/perf/util/session.h
> +++ b/tools/perf/util/session.h
> @@ -11,6 +11,7 @@
>  #include "ordered-events.h"
>  #include <linux/rbtree.h>
>  #include <linux/perf_event.h>
> +#include "evsel.h"
>  
>  struct ip_callchain;
>  struct thread;
> @@ -42,6 +43,10 @@ struct perf_session {
>  #define PRINT_IP_OPT_ONELINE	(1<<4)
>  #define PRINT_IP_OPT_SRCLINE	(1<<5)
>  
> +#define PERF_MSR_TSC		0
> +#define PERF_MSR_APERF		1
> +#define PERF_MSR_MPERF		2
> +
>  enum perf_freq_perf_index {
>  	FREQ_PERF_TSC		= 0,
>  	FREQ_PERF_APERF		= 1,
> @@ -52,6 +57,55 @@ enum perf_freq_perf_index {
>  	FREQ_PERF_MAX
>  };
>  
> +typedef u64 perf_freq_t[FREQ_PERF_MAX];
> +
> +static inline void perf_freq__init(unsigned int msr_pmu_type,
> +			    struct perf_evsel *evsel,
> +			    perf_freq_t array,
> +			    u64 value)
> +{
> +	if (evsel->attr.type == msr_pmu_type) {
> +		if (evsel->attr.config == PERF_MSR_TSC)
> +			array[FREQ_PERF_TSC] = value;
> +		if (evsel->attr.config == PERF_MSR_APERF)
> +			array[FREQ_PERF_APERF] = value;
> +		if (evsel->attr.config == PERF_MSR_MPERF)
> +			array[FREQ_PERF_MPERF] = value;
> +	}
> +	if (evsel->attr.type == PERF_TYPE_HARDWARE) {
> +		if (evsel->attr.config == PERF_COUNT_HW_CPU_CYCLES)
> +			array[FREQ_PERF_CYCLES] = value;
> +		if (evsel->attr.config == PERF_COUNT_HW_REF_CPU_CYCLES)
> +			array[FREQ_PERF_REF_CYCLES] = value;
> +	}
> +}
> +
> +static inline bool perf_freq__has_freq(perf_freq_t array)
> +{
> +	return ((array[FREQ_PERF_CYCLES] > 0) && (array[FREQ_PERF_REF_CYCLES] > 0));
> +}
> +static inline u64 perf_freq__get_freq(perf_freq_t array, u64 cpu_max_freq)
> +{
> +	return ((array[FREQ_PERF_CYCLES] * cpu_max_freq) / array[FREQ_PERF_REF_CYCLES]);
> +}
> +static inline bool perf_freq__has_cpu_util(perf_freq_t array)
> +{
> +	return ((array[FREQ_PERF_TSC] > 0) && (array[FREQ_PERF_REF_CYCLES] > 0));
> +}
> +static inline u64 perf_freq__get_cpu_util(perf_freq_t array)
> +{
> +	return ((100 * array[FREQ_PERF_REF_CYCLES]) / array[FREQ_PERF_TSC]);
> +}
> +
> +static inline bool perf_freq__has_core_busy(perf_freq_t array)
> +{
> +	return ((array[FREQ_PERF_APERF] > 0) && (array[FREQ_PERF_MPERF] > 0));
> +}
> +static inline u64 perf_freq__get_core_busy(perf_freq_t array)
> +{
> +	return ((100 * array[FREQ_PERF_APERF]) / array[FREQ_PERF_MPERF]);
> +}
> +
>  struct perf_tool;
>  
>  struct perf_session *perf_session__new(struct perf_data_file *file,
> -- 
> 1.8.3.1

  reply	other threads:[~2015-09-10 14:21 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-08 19:32 [PATCH V9 0/6] Freq/CPU%/CORE_BUSY% support kan.liang
2015-09-08 19:32 ` [PATCH V9 1/6] perf,tools: introduce generic FEAT for CPU attributes kan.liang
2015-09-10 13:58   ` Arnaldo Carvalho de Melo
2015-09-10 15:35     ` Arnaldo Carvalho de Melo
2015-09-10 20:50       ` Liang, Kan
2015-09-08 19:32 ` [PATCH V9 2/6] perf,tools: read msr pmu type from header kan.liang
2015-09-10 13:59   ` Arnaldo Carvalho de Melo
2015-09-14 21:16   ` Arnaldo Carvalho de Melo
2015-09-08 19:32 ` [PATCH V9 3/6] perf, record: introduce --freq-perf option kan.liang
2015-09-09 14:34   ` Jiri Olsa
2015-09-14 21:14   ` Arnaldo Carvalho de Melo
2015-09-08 19:32 ` [PATCH V9 4/6] perf,tools: Dump per-sample freq/CPU%/CORE_BUSY% in report -D kan.liang
2015-09-10 14:21   ` Arnaldo Carvalho de Melo [this message]
2015-09-08 19:32 ` [PATCH V9 5/6] perf,tools: caculate and save freq/CPU%/CORE_BUSY% in he_stat kan.liang
2015-09-08 19:32 ` [PATCH V9 6/6] perf,tools: Show freq/CPU%/CORE_BUSY% in perf report by --freq-perf kan.liang
2015-09-09 14:36   ` Jiri Olsa
2015-09-09 14:39 ` [PATCH V9 0/6] Freq/CPU%/CORE_BUSY% support Jiri Olsa

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=20150910142126.GC23511@kernel.org \
    --to=acme@kernel.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=adrian.hunter@intel.com \
    --cc=ak@linux.intel.com \
    --cc=eranian@google.com \
    --cc=jolsa@kernel.org \
    --cc=kan.liang@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --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 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.