mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: kan.liang@intel.com
To: peterz@infradead.org, mingo@redhat.com, acme@kernel.org,
	linux-kernel@vger.kernel.org
Cc: alexander.shishkin@linux.intel.com, tglx@linutronix.de,
	namhyung@kernel.org, jolsa@kernel.org, adrian.hunter@intel.com,
	wangnan0@huawei.com, mark.rutland@arm.com, andi@firstfloor.org,
	Kan Liang <kan.liang@intel.com>
Subject: [PATCH 01/14] perf/x86: Introduce PERF_RECORD_OVERHEAD
Date: Wed, 23 Nov 2016 04:44:39 -0500	[thread overview]
Message-ID: <1479894292-16277-2-git-send-email-kan.liang@intel.com> (raw)
In-Reply-To: <1479894292-16277-1-git-send-email-kan.liang@intel.com>

From: Kan Liang <kan.liang@intel.com>

A new perf record is introduced to export perf overhead information to
userspace. So we can measure the overhead of sampling directly.

To output the overhead information, it takes advantage of the existing
event log mechanism. But the overhead information is the system
overhead, not per-event overhead.

Signed-off-by: Kan Liang <kan.liang@intel.com>
---
 include/linux/perf_event.h      |  4 ++++
 include/uapi/linux/perf_event.h | 29 +++++++++++++++++++++++++++
 kernel/events/core.c            | 43 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 76 insertions(+)

diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 4741ecd..3a530a7 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -998,6 +998,10 @@ perf_event__output_id_sample(struct perf_event *event,
 extern void
 perf_log_lost_samples(struct perf_event *event, u64 lost);
 
+extern void
+perf_log_overhead(struct perf_event *event, u32 type,
+		  struct perf_overhead_entry *entry);
+
 static inline bool is_sampling_event(struct perf_event *event)
 {
 	return event->attr.sample_period != 0;
diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
index c66a485..ae571be 100644
--- a/include/uapi/linux/perf_event.h
+++ b/include/uapi/linux/perf_event.h
@@ -862,6 +862,17 @@ enum perf_event_type {
 	 */
 	PERF_RECORD_SWITCH_CPU_WIDE		= 15,
 
+	/*
+	 * Records perf overhead
+	 * struct {
+	 * 	struct perf_event_header 	header;
+	 * 	u32				type;
+	 * 	struct perf_overhead_entry	entry;
+	 * 	struct sample_id		sample_id;
+	 * };
+	 */
+	PERF_RECORD_OVERHEAD			= 16,
+
 	PERF_RECORD_MAX,			/* non-ABI */
 };
 
@@ -980,4 +991,22 @@ struct perf_branch_entry {
 		reserved:44;
 };
 
+enum perf_record_overhead_type {
+	PERF_OVERHEAD_MAX,
+};
+
+/*
+ * single overhead record layout:
+ *
+ * 	 cpu: The cpu which overhead occues
+ * 	  nr: Times of overhead happens.
+ * 	      E.g. for NMI, nr == times of NMI handler are called.
+ * 	time: Total overhead cost(ns)
+ */
+struct perf_overhead_entry {
+	__u32	cpu;
+	__u64	nr;
+	__u64	time;
+};
+
 #endif /* _UAPI_LINUX_PERF_EVENT_H */
diff --git a/kernel/events/core.c b/kernel/events/core.c
index ff230bb..590c399 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -7037,6 +7037,49 @@ static void perf_log_itrace_start(struct perf_event *event)
 	perf_output_end(&handle);
 }
 
+
+/*
+ * Record overhead logging
+ *
+ * The overhead logged here is the system overhead, not per-event overhead.
+ * This function only take advantage of the existing event log mechanism
+ * to log the overhead record.
+ *
+ */
+void perf_log_overhead(struct perf_event *event, u32 type,
+		       struct perf_overhead_entry *entry)
+{
+	struct perf_output_handle handle;
+	struct perf_sample_data sample;
+	int ret;
+
+	struct {
+		struct perf_event_header	header;
+		u32				type;
+		struct perf_overhead_entry	overhead;
+	} overhead_event = {
+		.header = {
+			.type = PERF_RECORD_OVERHEAD,
+			.misc = 0,
+			.size = sizeof(overhead_event),
+		},
+	};
+	overhead_event.type = type;
+	memcpy(&overhead_event.overhead, entry, sizeof(overhead_event.overhead));
+
+	perf_event_header__init_id(&overhead_event.header, &sample, event);
+	ret = perf_output_begin(&handle, event, overhead_event.header.size);
+
+	if (ret)
+		return;
+
+	perf_output_put(&handle, overhead_event);
+	perf_event__output_id_sample(event, &handle, &sample);
+
+	perf_output_end(&handle);
+	memset(entry, 0, sizeof(*entry));
+}
+
 /*
  * Generic event overflow handling, sampling.
  */
-- 
2.5.5

  reply	other threads:[~2016-11-23 17:48 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-23  9:44 [PATCH 00/14] export perf overheads information kan.liang
2016-11-23  9:44 ` kan.liang [this message]
2016-11-23 20:11   ` [PATCH 01/14] perf/x86: Introduce PERF_RECORD_OVERHEAD Peter Zijlstra
2016-11-23 20:13   ` Peter Zijlstra
2016-11-23 23:41   ` Jiri Olsa
2016-11-24 13:45     ` Liang, Kan
2016-11-24 13:50       ` Peter Zijlstra
2016-11-24 13:56         ` Liang, Kan
2016-11-24 14:27           ` Jiri Olsa
2016-11-24 14:39             ` Liang, Kan
2016-11-24 14:47               ` Jiri Olsa
2016-11-24 18:28         ` Andi Kleen
2016-11-24 18:58           ` Peter Zijlstra
2016-11-24 19:02             ` Andi Kleen
2016-11-24 19:08               ` Peter Zijlstra
2016-11-23  9:44 ` [PATCH 02/14] perf/x86: output NMI overhead kan.liang
2016-11-23 20:06   ` Peter Zijlstra
2016-11-24 16:19   ` Mark Rutland
2016-11-24 19:02     ` Peter Zijlstra
2016-11-24 19:40     ` Liang, Kan
2016-11-24 23:26       ` Namhyung Kim
2016-11-23  9:44 ` [PATCH 03/14] perf/x86: output multiplexing overhead kan.liang
2016-11-23 20:06   ` Peter Zijlstra
2016-11-23 20:09     ` Liang, Kan
2016-11-23  9:44 ` [PATCH 04/14] perf/x86: output side-band events overhead kan.liang
2016-11-23 20:06   ` Peter Zijlstra
2016-11-24 16:21   ` Mark Rutland
2016-11-24 19:40     ` Liang, Kan
2016-11-23  9:44 ` [PATCH 05/14] perf tools: handle PERF_RECORD_OVERHEAD record type kan.liang
2016-11-23 22:35   ` Jiri Olsa
2016-11-23 22:58     ` Jiri Olsa
2016-11-23  9:44 ` [PATCH 06/14] perf tools: show NMI overhead kan.liang
2016-11-23 22:51   ` Jiri Olsa
2016-11-24 13:37     ` Liang, Kan
2016-11-24 15:27       ` Jiri Olsa
2016-11-24 23:20         ` Namhyung Kim
2016-11-24 23:45           ` Jiri Olsa
2016-11-25  0:21         ` Andi Kleen
2016-11-23 22:52   ` Jiri Olsa
2016-11-23 22:52   ` Jiri Olsa
2016-11-23  9:44 ` [PATCH 07/14] perf tools: show multiplexing overhead kan.liang
2016-11-23  9:44 ` [PATCH 08/14] perf tools: show side-band events overhead kan.liang
2016-11-23  9:44 ` [PATCH 09/14] perf tools: make get_nsecs visible for buildin files kan.liang
2016-11-23  9:44 ` [PATCH 10/14] perf tools: introduce PERF_RECORD_USER_OVERHEAD kan.liang
2016-11-23  9:44 ` [PATCH 11/14] perf tools: record write data overhead kan.liang
2016-11-23 23:02   ` Jiri Olsa
2016-11-23 23:06   ` Jiri Olsa
2016-11-23  9:44 ` [PATCH 12/14] perf tools: record elapsed time kan.liang
2016-11-23  9:44 ` [PATCH 13/14] perf tools: warn on high overhead kan.liang
2016-11-23 20:25   ` Andi Kleen
2016-11-23 22:03     ` Liang, Kan
2016-11-25 20:42       ` Andi Kleen
2016-11-23  9:44 ` [PATCH 14/14] perf script: show overhead events kan.liang
2016-11-23 23:17   ` Jiri Olsa
2016-11-23 23:18   ` Jiri Olsa
2016-11-23 23:19   ` Jiri Olsa
2016-11-23 23:22   ` Jiri Olsa
2016-11-24  4:27 ` [PATCH 00/14] export perf overheads information Ingo Molnar

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=1479894292-16277-2-git-send-email-kan.liang@intel.com \
    --to=kan.liang@intel.com \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=andi@firstfloor.org \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome