Re: [PATCH v2] perf record: encode -k clockid frequency into Perf trace

From: Jiri Olsa
Date: Wed Oct 03 2018 - 09:39:29 EST


On Wed, Oct 03, 2018 at 10:01:56AM +0300, Alexey Budankov wrote:
>
> Store -k clockid frequency into Perf trace to enable timestamps
> derived metrics conversion into wall clock time on reporting stage.
>
> Below is the example of perf report output:
>
> tools/perf/perf record -k raw -- ../../matrix/linux/matrix.gcc
> ...
> [ perf record: Captured and wrote 31.222 MB perf.data (818054 samples) ]
>
> tools/perf/perf report --header
> # ========
> ...
> # event : name = cycles:ppp, , size = 112, { sample_period, sample_freq } = 4000, sample_type = IP|TID|TIME|PERIOD, disabled = 1, inherit = 1, mmap = 1, comm = 1, freq = 1, enable_on_exec = 1, task = 1, precise_ip = 3, sample_id_all = 1, exclude_guest = 1, mmap2 = 1, comm_exec = 1, use_clockid = 1, clockid = 4
> ...
> # clockid frequency: 1000 MHz
> ...
> # ========
>
> Signed-off-by: Alexey Budankov <alexey.budankov@xxxxxxxxxxxxxxx>
> ---
> Changes in v2:
> - renamed clockid_freq to clockid_res_ns and get_clockid_freq() to get_clockid_res()
> - avoided redundant define of NSEC_IN_SEC, reused linux/time64.h:NSEC_PER_SEC
> - moved MHz conversion into print_clockid() and shortened write_clockid()
> ---
> tools/perf/builtin-record.c | 21 +++++++++++++++++++--
> tools/perf/perf.h | 1 +
> tools/perf/util/env.h | 1 +
> tools/perf/util/header.c | 27 +++++++++++++++++++++++++++
> tools/perf/util/header.h | 1 +
> 5 files changed, 49 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index 0980dfe3396b..127dc7432394 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -592,6 +592,11 @@ static void record__init_features(struct record *rec)
> if (!rec->opts.full_auxtrace)
> perf_header__clear_feat(&session->header, HEADER_AUXTRACE);
>
> + if (rec->opts.use_clockid && rec->opts.clockid_res_ns)
> + session->header.env.clockid_res_ns = rec->opts.clockid_res_ns;
> + else
> + perf_header__clear_feat(&session->header, HEADER_CLOCKID);
> +

could you please keep only bits setting in record__init_features
and move the header.env.clockid_res_ns assignment out of it?

sry for not catching this in the first version

> perf_header__clear_feat(&session->header, HEADER_STAT);
> }
>
> @@ -1337,6 +1342,17 @@ static const struct clockid_map clockids[] = {
> CLOCKID_END,
> };
>
> +static int get_clockid_res(clockid_t clk_id, size_t *res_ns)
> +{
> + struct timespec res;
> +
> + *res_ns = 0;
> + if (!clock_getres(clk_id, &res))
> + *res_ns = res.tv_nsec + res.tv_sec * NSEC_PER_SEC;

hum, if this one fails (which I guess is unlikely) we should tell
and probably even quit

thanks,
jirka