mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Wang Nan <wangnan0@huawei.com>
To: Alexei Starovoitov <ast@kernel.org>,
	Arnaldo Carvalho de Melo <acme@redhat.com>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: "Adrian Hunter" <adrian.hunter@intel.com>,
	"Cody P Schafer" <dev@codyps.com>,
	"David S. Miller" <davem@davemloft.net>,
	"He Kuang" <hekuang@huawei.com>,
	"Jérémie Galarneau" <jeremie.galarneau@efficios.com>,
	"Jiri Olsa" <jolsa@kernel.org>,
	"Kirill Smelkov" <kirr@nexedi.com>,
	"Li Zefan" <lizefan@huawei.com>,
	"Masami Hiramatsu" <masami.hiramatsu.pt@hitachi.com>,
	"Namhyung Kim" <namhyung@kernel.org>,
	"Peter Zijlstra" <peterz@infradead.org>,
	pi3orama@163.com, "Wang Nan" <wangnan0@huawei.com>,
	linux-kernel@vger.kernel.org
Subject: [PATCH 35/48] perf tools: Operate multiple channels
Date: Mon, 22 Feb 2016 09:11:02 +0000	[thread overview]
Message-ID: <1456132275-98875-36-git-send-email-wangnan0@huawei.com> (raw)
In-Reply-To: <1456132275-98875-1-git-send-email-wangnan0@huawei.com>

Before this patch perf operates on only the first channel. Make perf
mmap and read from multiple channels.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Signed-off-by: He Kuang <hekuang@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
---
 tools/perf/builtin-record.c |  3 ++-
 tools/perf/util/evlist.c    | 55 ++++++++++++++++++++++++++++++++++-----------
 tools/perf/util/evlist.h    |  2 +-
 3 files changed, 45 insertions(+), 15 deletions(-)

diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index cf8f67a..a472950 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -466,8 +466,9 @@ static int record__mmap_read_all(struct record *rec)
 	u64 bytes_written = rec->bytes_written;
 	int i;
 	int rc = 0;
+	int total_mmaps = perf_evlist__mmap_nr(rec->evlist);
 
-	for (i = 0; i < rec->evlist->nr_mmaps; i++) {
+	for (i = 0; i < total_mmaps; i++) {
 		struct auxtrace_mmap *mm = &rec->evlist->mmap[i].auxtrace_mmap;
 
 		if (rec->evlist->mmap[i].base) {
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index d94f2c6..16f061c 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -873,6 +873,21 @@ static void __perf_evlist__munmap(struct perf_evlist *evlist, int idx)
 	auxtrace_mmap__munmap(&evlist->mmap[idx].auxtrace_mmap);
 }
 
+static void
+__perf_evlist__munmap_channels(struct perf_evlist *evlist, int _idx)
+{
+	int _ch;
+
+	for (_ch = 0; _ch < perf_evlist__channel_nr(evlist); _ch++) {
+		int err, idx = _idx, ch = _ch;
+
+		err = perf_evlist__channel_idx(evlist, &ch, &idx);
+		if (err < 0)
+			continue;
+		__perf_evlist__munmap(evlist, idx);
+	}
+}
+
 void perf_evlist__munmap(struct perf_evlist *evlist)
 {
 	int i;
@@ -980,26 +995,38 @@ perf_evlist__channel_complete(struct perf_evlist *evlist)
 	return 0;
 }
 
-static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx,
+static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int _idx,
 				       struct mmap_params *mp, int cpu,
-				       int thread, int *output)
+				       int thread, int *outputs)
 {
 	struct perf_evsel *evsel;
 
 	evlist__for_each(evlist, evsel) {
-		int fd;
+		int fd, channel, idx, err;
+
+		channel = perf_evlist__channel_find(evlist, evsel, false);
+		if (channel < 0) {
+			pr_err("ERROR: unable to find suitable channel for %s\n",
+			       evsel->name);
+			return -1;
+		}
+
+		idx = _idx;
+		err = perf_evlist__channel_idx(evlist, &channel, &idx);
+		if (err < 0)
+			return err;
 
 		if (evsel->system_wide && thread)
 			continue;
 
 		fd = FD(evsel, cpu, thread);
 
-		if (*output == -1) {
-			*output = fd;
-			if (__perf_evlist__mmap(evlist, idx, mp, *output) < 0)
+		if (outputs[channel] == -1) {
+			outputs[channel] = fd;
+			if (__perf_evlist__mmap(evlist, idx, mp, outputs[channel]) < 0)
 				return -1;
 		} else {
-			if (ioctl(fd, PERF_EVENT_IOC_SET_OUTPUT, *output) != 0)
+			if (ioctl(fd, PERF_EVENT_IOC_SET_OUTPUT, outputs[channel]) != 0)
 				return -1;
 
 			perf_evlist__mmap_get(evlist, idx);
@@ -1039,14 +1066,15 @@ static int perf_evlist__mmap_per_cpu(struct perf_evlist *evlist,
 
 	pr_debug2("perf event ring buffer mmapped per cpu\n");
 	for (cpu = 0; cpu < nr_cpus; cpu++) {
-		int output = -1;
+		int outputs[PERF_EVLIST__NR_CHANNELS];
 
+		memset(outputs, -1, sizeof(outputs));
 		auxtrace_mmap_params__set_idx(&mp->auxtrace_mp, evlist, cpu,
 					      true);
 
 		for (thread = 0; thread < nr_threads; thread++) {
 			if (perf_evlist__mmap_per_evsel(evlist, cpu, mp, cpu,
-							thread, &output))
+							thread, outputs))
 				goto out_unmap;
 		}
 	}
@@ -1055,7 +1083,7 @@ static int perf_evlist__mmap_per_cpu(struct perf_evlist *evlist,
 
 out_unmap:
 	for (cpu = 0; cpu < nr_cpus; cpu++)
-		__perf_evlist__munmap(evlist, cpu);
+		__perf_evlist__munmap_channels(evlist, cpu);
 	return -1;
 }
 
@@ -1067,13 +1095,14 @@ static int perf_evlist__mmap_per_thread(struct perf_evlist *evlist,
 
 	pr_debug2("perf event ring buffer mmapped per thread\n");
 	for (thread = 0; thread < nr_threads; thread++) {
-		int output = -1;
+		int outputs[PERF_EVLIST__NR_CHANNELS];
 
+		memset(outputs, -1, sizeof(outputs));
 		auxtrace_mmap_params__set_idx(&mp->auxtrace_mp, evlist, thread,
 					      false);
 
 		if (perf_evlist__mmap_per_evsel(evlist, thread, mp, 0, thread,
-						&output))
+						outputs))
 			goto out_unmap;
 	}
 
@@ -1081,7 +1110,7 @@ static int perf_evlist__mmap_per_thread(struct perf_evlist *evlist,
 
 out_unmap:
 	for (thread = 0; thread < nr_threads; thread++)
-		__perf_evlist__munmap(evlist, thread);
+		__perf_evlist__munmap_channels(evlist, thread);
 	return -1;
 }
 
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index 1812652..b652587 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -20,7 +20,7 @@ struct record_opts;
 #define PERF_EVLIST__HLIST_BITS 8
 #define PERF_EVLIST__HLIST_SIZE (1 << PERF_EVLIST__HLIST_BITS)
 
-#define PERF_EVLIST__NR_CHANNELS	1
+#define PERF_EVLIST__NR_CHANNELS	2
 enum perf_evlist_mmap_flag {
 	PERF_EVLIST__CHANNEL_ENABLED	= 1,
 };
-- 
1.8.3.4

  parent reply	other threads:[~2016-02-22  9:13 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-22  9:10 [PATCH 00/48] perf tools: Bugfix, BPF improvements and overwrite ring buffer support Wang Nan
2016-02-22  9:10 ` [PATCH 01/48] perf tools: Record text offset in dso to calculate objdump address Wang Nan
2016-02-22  9:10 ` [PATCH 02/48] perf tools: Adjust symbol for shared objects Wang Nan
2016-02-22  9:10 ` [PATCH 03/48] perf bpf: Add API to set values to map entries in a bpf object Wang Nan
2016-02-25  5:39   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-22  9:10 ` [PATCH 04/48] perf tools: Enable BPF object configure syntax Wang Nan
2016-02-25  5:39   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-22  9:10 ` [PATCH 05/48] perf record: Apply config to BPF objects before recording Wang Nan
2016-02-25  5:39   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-22  9:10 ` [PATCH 06/48] perf tools: Enable passing event to BPF object Wang Nan
2016-02-25  5:40   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-22  9:10 ` [PATCH 07/48] perf tools: Support setting different slots in a BPF map separately Wang Nan
2016-02-25  5:40   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-22  9:10 ` [PATCH 08/48] perf tools: Enable indices setting syntax for BPF map Wang Nan
2016-02-25  5:40   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-22  9:10 ` [PATCH 09/48] perf tools: Pass tracepoint options to BPF script Wang Nan
2016-02-25  5:41   ` [tip:perf/core] perf tools: Apply tracepoint event definition " tip-bot for Wang Nan
2016-02-22  9:10 ` [PATCH 10/48] perf tools: Introduce bpf-output event Wang Nan
2016-02-23 17:45   ` Arnaldo Carvalho de Melo
2016-02-24  1:58     ` Wangnan (F)
2016-02-24  2:04       ` Wangnan (F)
2016-02-24  4:03         ` Wangnan (F)
2016-02-24  5:03           ` Wangnan (F)
2016-02-24 13:36       ` Arnaldo Carvalho de Melo
2016-02-25  5:41   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-22  9:10 ` [PATCH 11/48] perf data: Support converting data from bpf_perf_event_output() Wang Nan
2016-02-23 16:14   ` Arnaldo Carvalho de Melo
2016-02-23 17:23   ` Jiri Olsa
2016-02-23 17:24     ` Jiri Olsa
2016-02-23 19:22   ` Jiri Olsa
2016-02-22  9:10 ` [PATCH 12/48] perf data: Explicitly set byte order for integer types Wang Nan
2016-02-22  9:10 ` [PATCH 13/48] perf core: Introduce new ioctl options to pause and resume ring buffer Wang Nan
2016-02-22  9:10 ` [PATCH 14/48] perf core: Set event's default overflow_handler Wang Nan
2016-02-22  9:10 ` [PATCH 15/48] perf core: Prepare writing into ring buffer from end Wang Nan
2016-02-22  9:10 ` [PATCH 16/48] perf core: Add backward attribute to perf event Wang Nan
2016-02-24 13:08   ` Jiri Olsa
2016-02-24 13:21     ` Jiri Olsa
2016-02-22  9:10 ` [PATCH 17/48] perf core: Reduce perf event output overhead by new overflow handler Wang Nan
2016-02-22  9:10 ` [PATCH 18/48] perf tools: Only validate is_pos for tracking evsels Wang Nan
2016-02-24 14:21   ` Jiri Olsa
2016-02-22  9:10 ` [PATCH 19/48] perf tools: Print write_backward value in perf_event_attr__fprintf Wang Nan
2016-02-22  9:10 ` [PATCH 20/48] perf tools: Make ordered_events reusable Wang Nan
2016-02-24 14:18   ` Jiri Olsa
2016-02-22  9:10 ` [PATCH 21/48] perf record: Extract synthesize code to record__synthesize() Wang Nan
2016-02-24 14:29   ` Jiri Olsa
2016-02-22  9:10 ` [PATCH 22/48] perf tools: Add perf_data_file__switch() helper Wang Nan
2016-02-24 14:34   ` Jiri Olsa
2016-02-22  9:10 ` [PATCH 23/48] perf record: Turns auxtrace_snapshot_enable into 3 states Wang Nan
2016-02-24 14:43   ` Jiri Olsa
2016-02-22  9:10 ` [PATCH 24/48] perf record: Introduce record__finish_output() to finish a perf.data Wang Nan
2016-02-22  9:10 ` [PATCH 25/48] perf record: Add '--timestamp-filename' option to append timestamp to output filename Wang Nan
2016-02-22  9:10 ` [PATCH 26/48] perf record: Split output into multiple files via '--switch-output' Wang Nan
2016-02-22  9:10 ` [PATCH 27/48] perf record: Force enable --timestamp-filename when --switch-output is provided Wang Nan
2016-02-22  9:10 ` [PATCH 28/48] perf record: Disable buildid cache options by default in switch output mode Wang Nan
2016-02-22  9:10 ` [PATCH 29/48] perf record: Re-synthesize tracking events after output switching Wang Nan
2016-02-24 14:57   ` Jiri Olsa
2016-02-22  9:10 ` [PATCH 30/48] perf record: Generate tracking events for process forked by perf Wang Nan
2016-02-24 15:01   ` Jiri Olsa
2016-02-22  9:10 ` [PATCH 31/48] perf record: Ensure return non-zero rc when mmap fail Wang Nan
2016-02-22  9:10 ` [PATCH 32/48] perf record: Prevent reading invalid data in record__mmap_read Wang Nan
2016-02-22  9:11 ` [PATCH 33/48] perf tools: Add evlist channel helpers Wang Nan
2016-02-22  9:11 ` [PATCH 34/48] perf tools: Automatically add new channel according to evlist Wang Nan
2016-02-22  9:11 ` Wang Nan [this message]
2016-02-22  9:11 ` [PATCH 36/48] perf tools: Squash overwrite setting into channel Wang Nan
2016-02-22  9:11 ` [PATCH 37/48] perf record: Don't read from and poll overwrite channel Wang Nan
2016-02-22  9:11 ` [PATCH 38/48] perf record: Don't poll on " Wang Nan
2016-02-22  9:11 ` [PATCH 39/48] perf tools: Detect avalibility of write_backward Wang Nan
2016-02-22  9:11 ` [PATCH 40/48] perf tools: Enable overwrite settings Wang Nan
2016-02-22  9:11 ` [PATCH 41/48] perf tools: Set write_backward attribut bit for overwrite events Wang Nan
2016-02-22  9:11 ` [PATCH 42/48] perf tools: Record fd into perf_mmap Wang Nan
2016-02-22  9:11 ` [PATCH 43/48] perf tools: Add API to pause a channel Wang Nan
2016-02-22  9:11 ` [PATCH 44/48] perf record: Toggle overwrite ring buffer for reading Wang Nan
2016-02-22  9:11 ` [PATCH 45/48] perf record: Rename variable to make code clear Wang Nan
2016-02-22  9:11 ` [PATCH 46/48] perf record: Read from backward ring buffer Wang Nan
2016-02-22  9:11 ` [PATCH 47/48] perf record: Allow generate tracking events at the end of output Wang Nan
2016-02-22  9:11 ` [PATCH 48/48] perf tools: Don't warn about out of order event if write_backward is used Wang Nan

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=1456132275-98875-36-git-send-email-wangnan0@huawei.com \
    --to=wangnan0@huawei.com \
    --cc=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=adrian.hunter@intel.com \
    --cc=ast@kernel.org \
    --cc=brendan.d.gregg@gmail.com \
    --cc=davem@davemloft.net \
    --cc=dev@codyps.com \
    --cc=hekuang@huawei.com \
    --cc=jeremie.galarneau@efficios.com \
    --cc=jolsa@kernel.org \
    --cc=kirr@nexedi.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizefan@huawei.com \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=pi3orama@163.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

all inboxes | Powered by JetHome®