On Mon, Jul 24, 2017 at 04:40:15PM -0700, Andi Kleen wrote:
> From: Andi Kleen <a...@linux.intel.com>
> 
> Some of the metrics formulas (like GFLOPs) need to know how long
> the measurement period is. Support an internal event called duration_time, 
> which
> reports time in second. It maps to the dummy event, but is
> special cased for statistics to report the walltime duration.
> 
> So far it is not printed, but only used internally for metrics.
> 
> Signed-off-by: Andi Kleen <a...@linux.intel.com>
> ---
>  tools/perf/util/parse-events.l |  1 +
>  tools/perf/util/stat-shadow.c  | 17 +++++++++++++----
>  2 files changed, 14 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
> index 07ee5bb3a8b0..f7bc74f8a615 100644
> --- a/tools/perf/util/parse-events.l
> +++ b/tools/perf/util/parse-events.l
> @@ -277,6 +277,7 @@ cpu-migrations|migrations                 { return 
> sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COU
>  alignment-faults                             { return sym(yyscanner, 
> PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
>  emulation-faults                             { return sym(yyscanner, 
> PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
>  dummy                                                { return sym(yyscanner, 
> PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
> +duration_time                                        { return sym(yyscanner, 
> PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }

not ideal to actualy create an kernel event for something we
need only access in userspace, but I could live with that..


>  bpf-output                                   { return sym(yyscanner, 
> PERF_TYPE_SOFTWARE, PERF_COUNT_SW_BPF_OUTPUT); }
>  
>       /*
> diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c
> index 122f37b38a65..34ae2960730b 100644
> --- a/tools/perf/util/stat-shadow.c
> +++ b/tools/perf/util/stat-shadow.c
> @@ -641,11 +641,20 @@ static void generic_metric(const char *metric_expr,
>       expr__add_id(&pctx, name, avg);
>       for (i = 0; metric_events[i]; i++) {
>               struct saved_value *v;
> +             struct stats *stats;
> +             double scale;
>  
> -             v = saved_value_lookup(metric_events[i], cpu, false);
> -             if (!v)
> -                     break;
> -             expr__add_id(&pctx, metric_events[i]->name, 
> avg_stats(&v->stats));
> +             if (!strcmp(metric_events[i]->name, "duration_time")) {
> +                     stats = &walltime_nsecs_stats;
> +                     scale = 1e-9;

however this will enable the event value only for metric processing
and following stat command will return 0:

[jolsa@krava perf]$ ./perf stat -e duration_time kill
kill: not enough arguments

 Performance counter stats for 'kill':

                 0      duration_time:u                                         
    

       0.006556409 seconds time elapsed

perhaps we could substitute the value when we read the event

also walltime_nsecs_stats is only updated at the end of the
workload, so this won't work for interval.. but not sure this
is an issue though

jirka

Reply via email to