linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/4] remove unnecessary IPI reading uncore events
@ 2016-08-17 20:55 David Carrillo-Cisneros
  2016-08-17 20:55 ` [PATCH v3 1/4] perf/core: check return value of perf_event_read IPI David Carrillo-Cisneros
                   ` (3 more replies)
  0 siblings, 4 replies; 25+ messages in thread
From: David Carrillo-Cisneros @ 2016-08-17 20:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: x86@kernel.org, Ingo Molnar, Thomas Gleixner, Andi Kleen,
	Kan Liang, Peter Zijlstra, Vegard Nossum, Paul Turner,
	Stephane Eranian, David Carrillo-Cisneros

This patch series adds a new flag to the struct perf_event
(and a flag field to store it) to allow a PMU to tag a CPU or
cgroup event as readable from any CPU in the same package and not
just the CPU where the is currently active.

This capability is used with uncore events to potentially avoid
an unnecessary IPI when executing perf_event_read.

A previous version of this change was introduced in the last Intel's
CQM/CMT driver series (under review), but now we present it separately
here since it is also useful for other uncore events.

The next version of Intel CQM/CMT will add 3 new flags that use
the pmu_event_flags field (added in patch 03 in this series).

Patch 02 generalizes event->group_flags so that new flags can use it
in a similar way that PERF_GROUP_SOFTWARE was used.

Patches rebased at peterz/queue/perf/core

Changes in v3:
  - Rebase to branch's tip.
  - Add warning to patch 01, in response to Ingo Molnar's comments.
  - Check for Active state in perf_event_read, as suggested by
  Nilay Vaish (already posted in v2's email thread).
Changes in v2:
  - Change logic to use event->group_flags instead of individually
  testing sibling in perf_event_read.
  - Remove erroneous read of inactive events.

David Carrillo-Cisneros (4):
  perf/core: check return value of perf_event_read IPI
  perf/core: generalize event->group_flags
  perf/core: introduce PMU_EV_CAP_READ_ACTIVE_PKG
  perf/x86: use PMUEF_READ_CPU_PKG in uncore events

 arch/x86/events/intel/rapl.c       |  2 ++
 arch/x86/events/intel/uncore.c     |  2 ++
 arch/x86/events/intel/uncore_snb.c |  2 ++
 include/linux/perf_event.h         | 21 +++++++++++++----
 kernel/events/core.c               | 47 ++++++++++++++++++++++++++++----------
 5 files changed, 57 insertions(+), 17 deletions(-)

-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply	[flat|nested] 25+ messages in thread
* [PATCH v2 3/4] perf/core: introduce PMU_EV_CAP_READ_ACTIVE_PKG
@ 2016-08-07  3:12 David Carrillo-Cisneros
  2016-08-08 10:00 ` [PATCH v3 " David Carrillo-Cisneros
  0 siblings, 1 reply; 25+ messages in thread
From: David Carrillo-Cisneros @ 2016-08-07  3:12 UTC (permalink / raw)
  To: linux-kernel
  Cc: x86@kernel.org, Ingo Molnar, Thomas Gleixner, Andi Kleen,
	Kan Liang, Peter Zijlstra, Vegard Nossum, Paul Turner,
	Stephane Eranian, David Carrillo-Cisneros

Introduce the flag PMU_EV_CAP_READ_ACTIVE_PKG, useful for uncore events,
that allows a PMU to signal the generic perf code that an event is readable
in the current CPU if the event is active in a CPU in the same package as
the current CPU.

This is an optimization that avoids a unnecessary IPI for the common case
where uncore events are run and read in the same package but in
different CPUs.

As an example, the IPI removal speeds up perf_read in my Haswell system
as follows:
  - For event UNC_C_LLC_LOOKUP: From 260 us to 31 us.
  - For event RAPL's power/energy-cores/: From to 255 us to 27 us.

For the optimization to work, all events in the group must have it
(similarly to PERF_EV_CAP_SOFTWARE).

Signed-off-by: David Carrillo-Cisneros <davidcc@google.com>
---
 include/linux/perf_event.h |  3 +++
 kernel/events/core.c       | 32 +++++++++++++++++++++++++-------
 2 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index fa5617f..c8bb1b3 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -501,8 +501,11 @@ typedef void (*perf_overflow_handler_t)(struct perf_event *,
  * Event capabilities. For event_caps and groups caps.
  *
  * PERF_EV_CAP_SOFTWARE: Is a software event.
+ * PERF_EV_CAP_READ_ACTIVE_PKG: A CPU event (or cgroup event) that can be read
+ * from any CPU in the package where it is active.
  */
 #define PERF_EV_CAP_SOFTWARE		BIT(0)
+#define PERF_EV_CAP_READ_ACTIVE_PKG	BIT(1)
 
 #define SWEVENT_HLIST_BITS		8
 #define SWEVENT_HLIST_SIZE		(1 << SWEVENT_HLIST_BITS)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 34049cc..77f1bd3 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3333,6 +3333,26 @@ struct perf_read_data {
 	int ret;
 };
 
+static int find_cpu_to_read(struct perf_event *event)
+{
+	bool active = event->state == PERF_EVENT_STATE_ACTIVE;
+	int event_cpu = event->oncpu, local_cpu = smp_processor_id();
+	u16 local_pkg, event_pkg;
+
+	if (!active)
+		return -1;
+
+	if (event->group_caps & PERF_EV_CAP_READ_ACTIVE_PKG) {
+		event_pkg =  topology_physical_package_id(event_cpu);
+		local_pkg =  topology_physical_package_id(local_cpu);
+
+		if (event_pkg == local_pkg)
+			return local_cpu;
+	}
+
+	return event_cpu;
+}
+
 /*
  * Cross CPU call to read the hardware event
  */
@@ -3454,19 +3474,17 @@ u64 perf_event_read_local(struct perf_event *event)
 
 static int perf_event_read(struct perf_event *event, bool group)
 {
-	int ret = 0;
+	int ret = 0, cpu_to_read;
 
-	/*
-	 * If event is enabled and currently active on a CPU, update the
-	 * value in the event structure:
-	 */
-	if (event->state == PERF_EVENT_STATE_ACTIVE) {
+	cpu_to_read = find_cpu_to_read(event);
+
+	if (cpu_to_read >= 0) {
 		struct perf_read_data data = {
 			.event = event,
 			.group = group,
 			.ret = 0,
 		};
-		ret = smp_call_function_single(event->oncpu,
+		ret = smp_call_function_single(cpu_to_read,
 					       __perf_event_read, &data, 1);
 		ret = ret ? : data.ret;
 	} else if (event->state == PERF_EVENT_STATE_INACTIVE) {
-- 
2.8.0.rc3.226.g39d4020

^ permalink raw reply related	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2016-10-09  7:10 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-08-17 20:55 [PATCH v3 0/4] remove unnecessary IPI reading uncore events David Carrillo-Cisneros
2016-08-17 20:55 ` [PATCH v3 1/4] perf/core: check return value of perf_event_read IPI David Carrillo-Cisneros
2016-08-18 10:52   ` [tip:perf/core] perf/core: Check return value of the perf_event_read() IPI tip-bot for David Carrillo-Cisneros
2016-08-21 12:10     ` Vegard Nossum
2016-08-22  7:17       ` Jiri Olsa
2016-08-22  8:29         ` Jiri Olsa
2016-08-22 10:38           ` Jiri Olsa
2016-08-28 18:09             ` Jiri Olsa
2016-08-29 10:03             ` Peter Zijlstra
2016-08-29 13:02               ` Peter Zijlstra
2016-08-29 13:14                 ` Vince Weaver
2016-08-29 18:58                 ` Jiri Olsa
2016-08-30  6:47                   ` Peter Zijlstra
2016-08-30  7:26                     ` Peter Zijlstra
2016-08-30  9:47                       ` Jiri Olsa
2016-08-30 16:26                 ` Stephane Eranian
2016-09-02  8:33                   ` Peter Zijlstra
2016-10-09  7:09   ` [lkp] [perf/core] 412929295f: WARNING: CPU: 2 PID: 600 at kernel/events/core.c:3530 perf_event_read+0x17d/0x190 kernel test robot
2016-08-17 20:55 ` [PATCH v3 2/4] perf/core: generalize event->group_flags David Carrillo-Cisneros
2016-08-18 10:53   ` [tip:perf/core] perf/core: Generalize event->group_flags tip-bot for David Carrillo-Cisneros
2016-08-17 20:55 ` [PATCH v3 3/4] perf/core: introduce PMU_EV_CAP_READ_ACTIVE_PKG David Carrillo-Cisneros
2016-08-18 10:54   ` [tip:perf/core] perf/core: Introduce PMU_EV_CAP_READ_ACTIVE_PKG tip-bot for David Carrillo-Cisneros
2016-08-17 20:55 ` [PATCH v3 4/4] perf/x86: use PMUEF_READ_CPU_PKG in uncore events David Carrillo-Cisneros
2016-08-18 10:54   ` [tip:perf/core] perf/x86: Use " tip-bot for David Carrillo-Cisneros
  -- strict thread matches above, loose matches on Subject: below --
2016-08-07  3:12 [PATCH v2 3/4] perf/core: introduce PMU_EV_CAP_READ_ACTIVE_PKG David Carrillo-Cisneros
2016-08-08 10:00 ` [PATCH v3 " David Carrillo-Cisneros

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).