All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexey Budankov <alexey.budankov@linux.intel.com>
To: Jiri Olsa <jolsa@kernel.org>, Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: "David Ahern" <dsahern@gmail.com>,
	lkml <linux-kernel@vger.kernel.org>,
	"Ingo Molnar" <mingo@kernel.org>,
	"Namhyung Kim" <namhyung@kernel.org>,
	"Alexander Shishkin" <alexander.shishkin@linux.intel.com>,
	"Peter Zijlstra" <a.p.zijlstra@chello.nl>,
	"Michael Petlan" <mpetlan@redhat.com>,
	"Ian Rogers" <irogers@google.com>,
	"Andi Kleen" <ak@linux.intel.com>,
	"Geneviève Bastien" <gbastien@versatic.net>,
	"Wang Nan" <wangnan0@huawei.com>,
	"Jeremie Galarneau" <jgalar@efficios.com>
Subject: Re: [PATCH 2/6] perf tools: Store clock references for -k/--clockid option
Date: Fri, 31 Jul 2020 18:52:36 +0300	[thread overview]
Message-ID: <9be7eb7b-4f73-84cc-95e9-e65101b30819@linux.intel.com> (raw)
In-Reply-To: <20200730213950.1503773-3-jolsa@kernel.org>


On 31.07.2020 0:39, Jiri Olsa wrote:
> Adding new CLOCK_DATA feature that stores reference times
> when -k/--clockid option is specified.
> 
> It contains clock id and its reference time together with
> wall clock time taken at the 'same time', both values are
> in nanoseconds.
> 
> The format of data is as below:
> 
>   struct {
>        u32 version;  /* version = 1 */
>        u32 clockid;
>        u64 clockid_time_ns;
>        u64 wall_clock_ns;
>   };
> 
> This clock reference times will be used in following changes
> to display wall clock for perf events.
> 
> It's available only for recording with clockid specified,
> because it's the only case where we can get reference time
> to wallclock time. It's can't do that with perf clock yet.
> 
> Original-patch-by: David Ahern <dsahern@gmail.com>
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  .../Documentation/perf.data-file-format.txt   |  13 ++
>  tools/perf/builtin-record.c                   |  41 +++++++
>  tools/perf/util/env.h                         |  12 ++
>  tools/perf/util/header.c                      | 112 ++++++++++++++++++
>  tools/perf/util/header.h                      |   1 +
>  5 files changed, 179 insertions(+)
> 
> diff --git a/tools/perf/Documentation/perf.data-file-format.txt b/tools/perf/Documentation/perf.data-file-format.txt
> index b6472e463284..c484e81987c7 100644
> --- a/tools/perf/Documentation/perf.data-file-format.txt
> +++ b/tools/perf/Documentation/perf.data-file-format.txt
> @@ -389,6 +389,19 @@ struct {
>  Example:
>   cpu pmu capabilities: branches=32, max_precise=3, pmu_name=icelake
>  
> +	HEADER_CLOCK_DATA = 29,
> +
> +	Contains clock id and its reference time together with wall clock
> +	time taken at the 'same time', both values are in nanoseconds.
> +	The format of data is as below.
> +
> +struct {
> +	u32 version;  /* version = 1 */
> +	u32 clockid;
> +	u64 clockid_time_ns;
> +	u64 wall_clock_ns;
> +};
> +
>  	other bits are reserved and should ignored for now
>  	HEADER_FEAT_BITS	= 256,
>  
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index 468c669519a6..f8280e721e1a 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -70,6 +70,7 @@
>  #include <linux/time64.h>
>  #include <linux/zalloc.h>
>  #include <linux/bitmap.h>
> +#include <sys/time.h>
>  
>  struct switch_output {
>  	bool		 enabled;
> @@ -1203,6 +1204,9 @@ static void record__init_features(struct record *rec)
>  	if (!(rec->opts.use_clockid && rec->opts.clockid_res_ns))
>  		perf_header__clear_feat(&session->header, HEADER_CLOCKID);
>  
> +	if (!rec->opts.use_clockid)
> +		perf_header__clear_feat(&session->header, HEADER_CLOCK_DATA);
> +
>  	perf_header__clear_feat(&session->header, HEADER_DIR_FORMAT);
>  	if (!record__comp_enabled(rec))
>  		perf_header__clear_feat(&session->header, HEADER_COMPRESSED);
> @@ -1551,6 +1555,40 @@ static int record__setup_sb_evlist(struct record *rec)
>  	return 0;
>  }
>  
> +static int record__init_clock(struct record *rec)
> +{
> +	struct perf_session *session = rec->session;
> +	struct timespec ref_clockid;
> +	struct timeval ref_tod;
> +	u64 ref;
> +
> +	if (!rec->opts.use_clockid)
> +		return 0;
> +
> +	session->header.env.clock.clockid = rec->opts.clockid;
> +
> +	if (gettimeofday(&ref_tod, NULL) != 0) {
> +		pr_err("gettimeofday failed, cannot set reference time.\n");
> +		return -1;
> +	}
> +
> +	if (clock_gettime(rec->opts.clockid, &ref_clockid)) {
> +		pr_err("clock_gettime failed, cannot set reference time.\n");
> +		return -1;
> +	}

It might also want to be implemented in a loop and iteration with minimal
time delta is chosen to improve synchronization accuracy and also mitigate
possible context switches between gettimeofday() and clock_gettime() calls.

Alexei

  reply	other threads:[~2020-07-31 15:52 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-30 21:39 [PATCH 0/6] perf tools: Add wallclock time conversion support Jiri Olsa
2020-07-30 21:39 ` [PATCH 1/6] perf tools: Add clockid_name function Jiri Olsa
2020-07-31 15:33   ` Andi Kleen
2020-07-31 16:19     ` Jiri Olsa
2020-07-30 21:39 ` [PATCH 2/6] perf tools: Store clock references for -k/--clockid option Jiri Olsa
2020-07-31 15:52   ` Alexey Budankov [this message]
2020-07-31 16:15     ` Jiri Olsa
2020-07-31 16:35       ` David Ahern
2020-08-03  3:55   ` Namhyung Kim
2020-08-03 11:35     ` Jiri Olsa
2020-07-30 21:39 ` [PATCH 3/6] perf tools: Move clockid_res_ns under clock struct Jiri Olsa
2020-07-30 21:39 ` [PATCH 4/6] perf tools: Add support to store time of day in CTF data conversion Jiri Olsa
2020-08-03  4:00   ` Namhyung Kim
2020-08-03 11:31     ` Jiri Olsa
2020-07-30 21:39 ` [PATCH 5/6] perf script: Change enum perf_output_field values to be 64 bits Jiri Olsa
2020-07-30 21:39 ` [PATCH 6/6] perf script: Add tod field to display time of day Jiri Olsa
2020-07-30 22:14 ` [PATCH 0/6] perf tools: Add wallclock time conversion support peterz
2020-07-31  1:21   ` David Ahern
2020-07-31  7:47     ` Jiri Olsa
2020-07-31 15:36       ` Andi Kleen
2020-07-31 18:05         ` peterz
2020-08-01  0:46           ` David Ahern
2020-08-01 17:49             ` Arnaldo Carvalho de Melo
2020-07-31 17:20     ` peterz

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=9be7eb7b-4f73-84cc-95e9-e65101b30819@linux.intel.com \
    --to=alexey.budankov@linux.intel.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@kernel.org \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=dsahern@gmail.com \
    --cc=gbastien@versatic.net \
    --cc=irogers@google.com \
    --cc=jgalar@efficios.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=mpetlan@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=wangnan0@huawei.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.