linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>, Thomas Gleixner <tglx@linutronix.de>
Cc: Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
	Clark Williams <williams@redhat.com>,
	linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
	Mathieu Poirier <mathieu.poirier@linaro.org>,
	Leo Yan <leo.yan@linaro.org>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jiri Olsa <jolsa@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Suzuki Poulouse <suzuki.poulose@arm.com>,
	coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org,
	Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 50/85] perf cs-etm: Add support for multiple traceID queues
Date: Tue, 11 Jun 2019 15:58:36 -0300	[thread overview]
Message-ID: <20190611185911.11645-51-acme@kernel.org> (raw)
In-Reply-To: <20190611185911.11645-1-acme@kernel.org>

From: Mathieu Poirier <mathieu.poirier@linaro.org>

When operating in CPU-wide trace mode with a source/sink topology of N:1
packets with multiple traceID will end up in the same cs_etm_queue.  In
order to properly decode packets they need to be split in different
queues, i.e one queue per traceID.

As such add support for multiple traceID per cs_etm_queue by adding a
new cs_etm_traceid_queue every time a new traceID is discovered in the
trace stream.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Tested-by: Leo Yan <leo.yan@linaro.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
Cc: coresight@lists.linaro.org
Cc: linux-arm-kernel@lists.infradead.org
Link: http://lkml.kernel.org/r/20190524173508.29044-15-mathieu.poirier@linaro.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/Makefile.config |   3 +
 tools/perf/util/cs-etm.c   | 131 ++++++++++++++++++++++++++++++-------
 2 files changed, 110 insertions(+), 24 deletions(-)

diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 85fbcd265351..51dd00f65709 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -413,6 +413,9 @@ ifdef CORESIGHT
   $(call feature_check,libopencsd)
   ifeq ($(feature-libopencsd), 1)
     CFLAGS += -DHAVE_CSTRACE_SUPPORT $(LIBOPENCSD_CFLAGS)
+    ifeq ($(feature-reallocarray), 0)
+      CFLAGS += -DCOMPAT_NEED_REALLOCARRAY
+    endif
     LDFLAGS += $(LIBOPENCSD_LDFLAGS)
     EXTLIBS += $(OPENCSDLIBS)
     $(call detected,CONFIG_LIBOPENCSD)
diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c
index 2483293266d8..afc2491f9f2a 100644
--- a/tools/perf/util/cs-etm.c
+++ b/tools/perf/util/cs-etm.c
@@ -29,6 +29,7 @@
 #include "thread.h"
 #include "thread_map.h"
 #include "thread-stack.h"
+#include <tools/libc_compat.h>
 #include "util.h"
 
 #define MAX_TIMESTAMP (~0ULL)
@@ -82,7 +83,9 @@ struct cs_etm_queue {
 	u64 offset;
 	const unsigned char *buf;
 	size_t buf_len, buf_used;
-	struct cs_etm_traceid_queue *traceid_queues;
+	/* Conversion between traceID and index in traceid_queues array */
+	struct intlist *traceid_queues_list;
+	struct cs_etm_traceid_queue **traceid_queues;
 };
 
 static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
@@ -208,31 +211,71 @@ static int cs_etm__init_traceid_queue(struct cs_etm_queue *etmq,
 static struct cs_etm_traceid_queue
 *cs_etm__etmq_get_traceid_queue(struct cs_etm_queue *etmq, u8 trace_chan_id)
 {
-	struct cs_etm_traceid_queue *tidq;
+	int idx;
+	struct int_node *inode;
+	struct intlist *traceid_queues_list;
+	struct cs_etm_traceid_queue *tidq, **traceid_queues;
 	struct cs_etm_auxtrace *etm = etmq->etm;
 
-	if (!etm->timeless_decoding)
-		return NULL;
+	if (etm->timeless_decoding)
+		trace_chan_id = CS_ETM_PER_THREAD_TRACEID;
 
-	tidq = etmq->traceid_queues;
+	traceid_queues_list = etmq->traceid_queues_list;
 
-	if (tidq)
-		return tidq;
+	/*
+	 * Check if the traceid_queue exist for this traceID by looking
+	 * in the queue list.
+	 */
+	inode = intlist__find(traceid_queues_list, trace_chan_id);
+	if (inode) {
+		idx = (int)(intptr_t)inode->priv;
+		return etmq->traceid_queues[idx];
+	}
 
+	/* We couldn't find a traceid_queue for this traceID, allocate one */
 	tidq = malloc(sizeof(*tidq));
 	if (!tidq)
 		return NULL;
 
 	memset(tidq, 0, sizeof(*tidq));
 
+	/* Get a valid index for the new traceid_queue */
+	idx = intlist__nr_entries(traceid_queues_list);
+	/* Memory for the inode is free'ed in cs_etm_free_traceid_queues () */
+	inode = intlist__findnew(traceid_queues_list, trace_chan_id);
+	if (!inode)
+		goto out_free;
+
+	/* Associate this traceID with this index */
+	inode->priv = (void *)(intptr_t)idx;
+
 	if (cs_etm__init_traceid_queue(etmq, tidq, trace_chan_id))
 		goto out_free;
 
-	etmq->traceid_queues = tidq;
+	/* Grow the traceid_queues array by one unit */
+	traceid_queues = etmq->traceid_queues;
+	traceid_queues = reallocarray(traceid_queues,
+				      idx + 1,
+				      sizeof(*traceid_queues));
+
+	/*
+	 * On failure reallocarray() returns NULL and the original block of
+	 * memory is left untouched.
+	 */
+	if (!traceid_queues)
+		goto out_free;
+
+	traceid_queues[idx] = tidq;
+	etmq->traceid_queues = traceid_queues;
 
-	return etmq->traceid_queues;
+	return etmq->traceid_queues[idx];
 
 out_free:
+	/*
+	 * Function intlist__remove() removes the inode from the list
+	 * and delete the memory associated to it.
+	 */
+	intlist__remove(traceid_queues_list, inode);
 	free(tidq);
 
 	return NULL;
@@ -412,6 +455,44 @@ static int cs_etm__flush_events(struct perf_session *session,
 	return cs_etm__process_timeless_queues(etm, -1);
 }
 
+static void cs_etm__free_traceid_queues(struct cs_etm_queue *etmq)
+{
+	int idx;
+	uintptr_t priv;
+	struct int_node *inode, *tmp;
+	struct cs_etm_traceid_queue *tidq;
+	struct intlist *traceid_queues_list = etmq->traceid_queues_list;
+
+	intlist__for_each_entry_safe(inode, tmp, traceid_queues_list) {
+		priv = (uintptr_t)inode->priv;
+		idx = priv;
+
+		/* Free this traceid_queue from the array */
+		tidq = etmq->traceid_queues[idx];
+		thread__zput(tidq->thread);
+		zfree(&tidq->event_buf);
+		zfree(&tidq->last_branch);
+		zfree(&tidq->last_branch_rb);
+		zfree(&tidq->prev_packet);
+		zfree(&tidq->packet);
+		zfree(&tidq);
+
+		/*
+		 * Function intlist__remove() removes the inode from the list
+		 * and delete the memory associated to it.
+		 */
+		intlist__remove(traceid_queues_list, inode);
+	}
+
+	/* Then the RB tree itself */
+	intlist__delete(traceid_queues_list);
+	etmq->traceid_queues_list = NULL;
+
+	/* finally free the traceid_queues array */
+	free(etmq->traceid_queues);
+	etmq->traceid_queues = NULL;
+}
+
 static void cs_etm__free_queue(void *priv)
 {
 	struct cs_etm_queue *etmq = priv;
@@ -419,14 +500,8 @@ static void cs_etm__free_queue(void *priv)
 	if (!etmq)
 		return;
 
-	thread__zput(etmq->traceid_queues->thread);
 	cs_etm_decoder__free(etmq->decoder);
-	zfree(&etmq->traceid_queues->event_buf);
-	zfree(&etmq->traceid_queues->last_branch);
-	zfree(&etmq->traceid_queues->last_branch_rb);
-	zfree(&etmq->traceid_queues->prev_packet);
-	zfree(&etmq->traceid_queues->packet);
-	zfree(&etmq->traceid_queues);
+	cs_etm__free_traceid_queues(etmq);
 	free(etmq);
 }
 
@@ -497,19 +572,21 @@ static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u8 trace_chan_id,
 	u8  cpumode;
 	u64 offset;
 	int len;
-	struct	 thread *thread;
-	struct	 machine *machine;
-	struct	 addr_location al;
-
-	(void)trace_chan_id;
+	struct thread *thread;
+	struct machine *machine;
+	struct addr_location al;
+	struct cs_etm_traceid_queue *tidq;
 
 	if (!etmq)
 		return 0;
 
 	machine = etmq->etm->machine;
 	cpumode = cs_etm__cpu_mode(etmq, address);
+	tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
+	if (!tidq)
+		return 0;
 
-	thread = etmq->traceid_queues->thread;
+	thread = tidq->thread;
 	if (!thread) {
 		if (cpumode != PERF_RECORD_MISC_KERNEL)
 			return 0;
@@ -545,6 +622,10 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm)
 	if (!etmq)
 		return NULL;
 
+	etmq->traceid_queues_list = intlist__new(NULL);
+	if (!etmq->traceid_queues_list)
+		goto out_free;
+
 	/* Use metadata to fill in trace parameters for trace decoder */
 	t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
 
@@ -579,6 +660,7 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm)
 out_free_decoder:
 	cs_etm_decoder__free(etmq->decoder);
 out_free:
+	intlist__delete(etmq->traceid_queues_list);
 	free(etmq);
 
 	return NULL;
@@ -1280,8 +1362,9 @@ static bool cs_etm__is_svc_instr(struct cs_etm_queue *etmq, u8 trace_chan_id,
 				 struct cs_etm_packet *packet,
 				 u64 end_addr)
 {
-	u16 instr16;
-	u32 instr32;
+	/* Initialise to keep compiler happy */
+	u16 instr16 = 0;
+	u32 instr32 = 0;
 	u64 addr;
 
 	switch (packet->isa) {
-- 
2.20.1

  parent reply	other threads:[~2019-06-11 18:58 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-11 18:57 [GIT PULL] perf/core improvements and fixes Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 01/85] perf data: Add description of header HEADER_BPF_PROG_INFO and HEADER_BPF_BTF Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 02/85] perf data: Document memory topology header: HEADER_MEM_TOPOLOGY Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 03/85] perf data: Document clockid header: HEADER_CLOCKID Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 04/85] perf data: Document directory format header: HEADER_DIR_FORMAT Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 05/85] perf symbols: Remove unused variable 'err' Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 06/85] perf record: Allow mixing --user-regs with --call-graph=dwarf Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 07/85] perf intel-pt: Factor out intel_pt_update_sample_time Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 08/85] perf intel-pt: Accumulate cycle count from CYC packets Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 09/85] perf tools: Add IPC information to perf_sample Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 10/85] perf intel-pt: Add support for samples to contain IPC ratio Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 11/85] perf script: Add output of " Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 12/85] perf intel-pt: Record when decoding PSB+ packets Arnaldo Carvalho de Melo
2019-06-11 18:57 ` [PATCH 13/85] perf intel-pt: Re-factor TIP cases in intel_pt_walk_to_ip Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 14/85] perf intel-pt: Accumulate cycle count from TSC/TMA/MTC packets Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 15/85] perf intel-pt: Document IPC usage Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 16/85] perf thread-stack: Accumulate IPC information Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 17/85] perf db-export: Add brief documentation Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 18/85] perf db-export: Export IPC information Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 19/85] perf scripts python: export-to-sqlite.py: " Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 20/85] perf scripts python: export-to-postgresql.py: " Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 21/85] perf scripts python: exported-sql-viewer.py: Add IPC information to the Branch reports Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 22/85] perf scripts python: exported-sql-viewer.py: Add CallGraphModelParams Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 23/85] perf scripts python: exported-sql-viewer.py: Add IPC information to Call Graph Graph Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 24/85] perf scripts python: exported-sql-viewer.py: Add IPC information to Call Tree Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 25/85] perf scripts python: exported-sql-viewer.py: Select find text when find bar is activated Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 26/85] perf augmented_raw_syscalls: Tell which args are filenames and how many bytes to copy Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 27/85] perf augmented_raw_syscalls: Move the probe_read_str to a separate function Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 28/85] perf augmented_raw_syscalls: Change helper to consider just the augmented_filename part Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 29/85] perf augmented_raw_syscalls: Move reading filename to the loop Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 30/85] perf jvmti: Address gcc string overflow warning for strncpy() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 31/85] perf trace: Consume the augmented_raw_syscalls payload Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 32/85] perf trace: Associate more argument names with the filename beautifier Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 33/85] perf trace: Exit when failing to build eBPF program Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 34/85] perf config: Bail out when a handler returns failure for a key-value pair Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 35/85] perf record: Add support to collect callchains from kernel or user space only Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 36/85] perf evsel: Remove superfluous nthreads system_wide setup in alloc_fd() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 37/85] perf cs-etm: Configure contextID tracing in CPU-wide mode Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 38/85] perf cs-etm: Configure timestamp generation " Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 39/85] perf cs-etm: Configure SWITCH_EVENTS " Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 40/85] perf cs-etm: Add handling of itrace start events Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 41/85] perf cs-etm: Add handling of switch-CPU-wide events Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 42/85] perf cs-etm: Refactor error path in cs_etm_decoder__new() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 43/85] perf cs-etm: Move packet queue out of decoder structure Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 44/85] perf cs-etm: Fix indentation in function cs_etm__process_decoder_queue() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 45/85] perf cs-etm: Introduce the concept of trace ID queues Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 46/85] perf cs-etm: Get rid of unused cpu in struct cs_etm_queue Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 47/85] perf cs-etm: Move thread to traceid_queue Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 48/85] perf cs-etm: Move tid/pid " Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 49/85] perf cs-etm: Use traceID aware memory callback API Arnaldo Carvalho de Melo
2019-06-11 18:58 ` Arnaldo Carvalho de Melo [this message]
2019-06-11 18:58 ` [PATCH 51/85] perf cs-etm: Linking PE contextID with perf thread mechanic Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 52/85] perf cs-etm: Add notion of time to decoding code Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 53/85] perf cs-etm: Add support for CPU-wide trace scenarios Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 54/85] perf cpumap: Retrieve die id information Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 55/85] perf header: Add die information in CPU topology Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 56/85] perf stat: Support per-die aggregation Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 57/85] perf header: Rename "sibling cores" to "sibling sockets" Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 58/85] perf tools: Apply new CPU topology sysfs attributes Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 59/85] perf data: Fix perf.data documentation for HEADER_CPU_TOPOLOGY Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 60/85] perf cs-etm: Properly set the value of 'old' and 'head' in snapshot mode Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 61/85] perf cs-etm: Remove duplicate GENMASK() define, use linux/bits.h instead Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 62/85] perf config: Update default value for llvm.clang-bpf-cmd-template Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 63/85] perf auxtrace: Add perf time interval to itrace_synth_ops Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 64/85] perf script: Set perf time interval in itrace_synth_ops Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 65/85] perf report: " Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 66/85] perf intel-pt: Add lookahead callback Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 67/85] perf intel-pt: Factor out intel_pt_8b_tsc() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 68/85] perf intel-pt: Factor out intel_pt_reposition() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 69/85] perf intel-pt: Add reposition parameter to intel_pt_get_data() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 70/85] perf intel-pt: Add intel_pt_fast_forward() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 71/85] perf intel-pt: Factor out intel_pt_get_buffer() Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 72/85] perf intel-pt: Add support for lookahead Arnaldo Carvalho de Melo
2019-06-11 18:58 ` [PATCH 73/85] perf intel-pt: Add support for efficient time interval filtering Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 74/85] perf time-utils: Treat time ranges consistently Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 75/85] perf time-utils: Factor out set_percent_time() Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 76/85] perf time-utils: Prevent percentage time range overlap Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 77/85] perf time-utils: Fix --time documentation Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 78/85] perf time-utils: Simplify perf_time__parse_for_ranges() error paths slightly Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 79/85] perf time-utils: Make perf_time__parse_for_ranges() more logical Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 80/85] perf tests: Add a test for time-utils Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 81/85] perf time-utils: Add support for multiple explicit time intervals Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 82/85] perf test 6: Fix missing kvm module load for s390 Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 83/85] perf report: Fix OOM error in TUI mode on s390 Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 84/85] perf report: Support s390 diag event display on x86 Arnaldo Carvalho de Melo
2019-06-11 18:59 ` [PATCH 85/85] perf trace: Skip unknown syscalls when expanding strace like syscall groups Arnaldo Carvalho de Melo
2019-06-17 18:48 ` [GIT PULL] perf/core improvements and fixes 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=20190611185911.11645-51-acme@kernel.org \
    --to=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=coresight@lists.linaro.org \
    --cc=jolsa@kernel.org \
    --cc=jolsa@redhat.com \
    --cc=leo.yan@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mathieu.poirier@linaro.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=suzuki.poulose@arm.com \
    --cc=tglx@linutronix.de \
    --cc=williams@redhat.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;
as well as URLs for NNTP newsgroup(s).