From: kan.liang@linux.intel.com
To: tglx@linutronix.de, jstultz@google.com, peterz@infradead.org,
mingo@redhat.com, linux-kernel@vger.kernel.org
Cc: sboyd@kernel.org, eranian@google.com, namhyung@kernel.org,
ak@linux.intel.com, adrian.hunter@intel.com,
Kan Liang <kan.liang@linux.intel.com>
Subject: [RFC PATCH V2 8/9] perf evsel, tsc: Support the monotonic raw clock conversion
Date: Mon, 13 Feb 2023 11:07:53 -0800 [thread overview]
Message-ID: <20230213190754.1836051-9-kan.liang@linux.intel.com> (raw)
In-Reply-To: <20230213190754.1836051-1-kan.liang@linux.intel.com>
From: Kan Liang <kan.liang@linux.intel.com>
The cap_user_time_mono_raw indicates that the kernel relies on the perf
tool to convert the HW time to the monotonic raw clock.
Add tsc_to_monotonic_raw() to do the conversion.
The conversion information is stored in the session, which cannot be
read in evsel parsing. Add a pointor in the evlist to point to the
conversion information.
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
---
tools/perf/util/evlist.h | 1 +
tools/perf/util/evsel.c | 17 +++++++++++++++--
tools/perf/util/evsel.h | 7 +++++++
tools/perf/util/session.c | 1 +
tools/perf/util/tsc.c | 12 ++++++++++++
tools/perf/util/tsc.h | 2 ++
6 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index 01fa9d592c5a..d860dc94009c 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -82,6 +82,7 @@ struct evlist {
int pos; /* index at evlist core object to check signals */
} ctl_fd;
struct event_enable_timer *eet;
+ struct perf_record_time_conv *time_conv;
};
struct evsel_str_handler {
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 999dd1700502..5e27ac2b9f9b 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -50,6 +50,7 @@
#include "off_cpu.h"
#include "../perf-sys.h"
#include "util/parse-branch-options.h"
+#include "tsc.h"
#include <internal/xyarray.h>
#include <internal/lib.h>
#include <internal/threadmap.h>
@@ -2349,6 +2350,18 @@ u64 evsel__bitfield_swap_branch_flags(u64 value)
return new_val;
}
+static u64 perf_evsel_parse_time(struct evsel *evsel, u64 time)
+{
+ /*
+ * The HW time can only be generated by HW events.
+ */
+ if ((evsel->core.attr.clockid == CLOCK_MONOTONIC_RAW) &&
+ evsel->evlist->time_conv && evsel__is_hw_event(evsel))
+ return tsc_to_monotonic_raw(evsel->evlist->time_conv, time);
+
+ return time;
+}
+
int evsel__parse_sample(struct evsel *evsel, union perf_event *event,
struct perf_sample *data)
{
@@ -2411,7 +2424,7 @@ int evsel__parse_sample(struct evsel *evsel, union perf_event *event,
}
if (type & PERF_SAMPLE_TIME) {
- data->time = *array;
+ data->time = perf_evsel_parse_time(evsel, *array);
array++;
}
@@ -2734,7 +2747,7 @@ int evsel__parse_sample_timestamp(struct evsel *evsel, union perf_event *event,
array++;
if (type & PERF_SAMPLE_TIME)
- *timestamp = *array;
+ *timestamp = perf_evsel_parse_time(evsel, *array);
return 0;
}
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index d572be41b960..d1ef67852bda 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -269,6 +269,13 @@ static inline bool evsel__is_bpf(struct evsel *evsel)
return evsel->bpf_counter_ops != NULL;
}
+static inline bool evsel__is_hw_event(struct evsel *evsel)
+{
+ return (evsel->core.attr.type == PERF_TYPE_HARDWARE) ||
+ (evsel->core.attr.type == PERF_TYPE_HW_CACHE) ||
+ (evsel->core.attr.type == PERF_TYPE_RAW);
+}
+
#define EVSEL__MAX_ALIASES 8
extern const char *const evsel__hw_cache[PERF_COUNT_HW_CACHE_MAX][EVSEL__MAX_ALIASES];
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 189149a7012f..d80d0c4e46da 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1725,6 +1725,7 @@ static s64 perf_session__process_user_event(struct perf_session *session,
return tool->stat_round(session, event);
case PERF_RECORD_TIME_CONV:
session->time_conv = event->time_conv;
+ session->evlist->time_conv = &session->time_conv;
return tool->time_conv(session, event);
case PERF_RECORD_HEADER_FEATURE:
return tool->feature(session, event);
diff --git a/tools/perf/util/tsc.c b/tools/perf/util/tsc.c
index 0b59c0f815f9..5264f9d54be4 100644
--- a/tools/perf/util/tsc.c
+++ b/tools/perf/util/tsc.c
@@ -160,3 +160,15 @@ size_t perf_event__fprintf_time_conv(union perf_event *event, FILE *fp)
return ret;
}
+
+u64 tsc_to_monotonic_raw(struct perf_record_time_conv *tc, u64 cyc)
+{
+ u64 delta;
+
+ if (!tc->cap_user_time_mono_raw)
+ return cyc;
+
+ delta = (cyc - tc->time_mono_last) * tc->time_mono_mult + tc->time_mono_nsec;
+ delta >>= tc->time_mono_shift;
+ return tc->time_mono_base + delta;
+}
diff --git a/tools/perf/util/tsc.h b/tools/perf/util/tsc.h
index 6bacc450a14d..2611d3de94b1 100644
--- a/tools/perf/util/tsc.h
+++ b/tools/perf/util/tsc.h
@@ -35,4 +35,6 @@ double arch_get_tsc_freq(void);
size_t perf_event__fprintf_time_conv(union perf_event *event, FILE *fp);
+u64 tsc_to_monotonic_raw(struct perf_record_time_conv *tc, u64 cyc);
+
#endif // __PERF_TSC_H
--
2.35.1
next prev parent reply other threads:[~2023-02-13 19:08 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-13 19:07 [RFC PATCH V2 0/9] Convert TSC to monotonic raw clock for PEBS kan.liang
2023-02-13 19:07 ` [RFC PATCH V2 1/9] timekeeping: Expose the conversion information of monotonic raw kan.liang
2023-02-13 19:28 ` John Stultz
2023-02-13 19:07 ` [RFC PATCH V2 2/9] perf: Extend ABI to support post-processing monotonic raw conversion kan.liang
2023-02-13 19:37 ` John Stultz
2023-02-13 21:40 ` Liang, Kan
2023-02-13 22:22 ` John Stultz
2023-02-14 10:43 ` Peter Zijlstra
2023-02-14 17:46 ` Liang, Kan
2023-02-14 19:37 ` John Stultz
2023-02-14 20:09 ` Liang, Kan
2023-02-14 20:21 ` John Stultz
2023-03-12 20:50 ` Andi Kleen
2023-02-14 19:34 ` John Stultz
2023-02-14 14:51 ` Liang, Kan
2023-02-14 17:00 ` Liang, Kan
2023-02-14 20:11 ` John Stultz
2023-02-14 20:38 ` Liang, Kan
2023-02-17 23:11 ` John Stultz
2023-03-08 18:44 ` Liang, Kan
2023-03-09 1:17 ` John Stultz
2023-03-09 16:56 ` Liang, Kan
2023-03-11 5:55 ` John Stultz
2023-03-13 21:19 ` Liang, Kan
2023-03-18 6:02 ` John Stultz
2023-03-21 15:26 ` Liang, Kan
2023-02-14 19:52 ` John Stultz
2023-02-13 19:07 ` [RFC PATCH V2 3/9] perf/x86: Factor out x86_pmu_sample_preload() kan.liang
2023-02-13 19:07 ` [RFC PATCH V2 4/9] perf/x86: Enable post-processing monotonic raw conversion kan.liang
2023-02-14 20:02 ` Thomas Gleixner
2023-02-14 20:21 ` Liang, Kan
2023-02-14 20:55 ` Thomas Gleixner
2023-03-21 15:38 ` Liang, Kan
2023-02-13 19:07 ` [RFC PATCH V2 5/9] perf/x86/intel: Enable large PEBS for monotonic raw kan.liang
2023-02-13 19:07 ` [RFC PATCH V2 6/9] tools headers UAPI: Sync linux/perf_event.h with the kernel sources kan.liang
2023-02-13 19:07 ` [RFC PATCH V2 7/9] perf session: Support the monotonic raw clock conversion information kan.liang
2023-02-13 19:07 ` kan.liang [this message]
2023-02-13 19:07 ` [RFC PATCH V2 9/9] perf evsel: Enable post-processing monotonic raw conversion by default kan.liang
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=20230213190754.1836051-9-kan.liang@linux.intel.com \
--to=kan.liang@linux.intel.com \
--cc=adrian.hunter@intel.com \
--cc=ak@linux.intel.com \
--cc=eranian@google.com \
--cc=jstultz@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=sboyd@kernel.org \
--cc=tglx@linutronix.de \
/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.