linux-kernel.vger.kernel.org archive mirror
 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 42/55] perf tools: Operate multiple channels
Date: Fri, 19 Feb 2016 11:44:30 +0000	[thread overview]
Message-ID: <1455882283-79592-43-git-send-email-wangnan0@huawei.com> (raw)
In-Reply-To: <1455882283-79592-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-19 11:51 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-19 11:43 [PATCH 00/55] perf tools: Bugfix, BPF improvements and overwrite ring buffer support Wang Nan
2016-02-19 11:43 ` [PATCH 01/55] perf tools: Record text offset in dso to calculate objdump address Wang Nan
2016-02-19 11:43 ` [PATCH 02/55] perf tools: Adjust symbol for shared objects Wang Nan
2016-02-19 11:43 ` [PATCH 03/55] perf tools: Rename bpf_prog_priv__clear() to clear_prog_priv() Wang Nan
2016-02-20 11:36   ` [tip:perf/core] perf bpf: " tip-bot for Wang Nan
2016-02-19 11:43 ` [PATCH 04/55] perf tools: Fix checking asprintf return value Wang Nan
2016-02-20 11:36   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-19 11:43 ` [PATCH 05/55] perf tools: Add API to config maps in bpf object Wang Nan
2016-02-19 11:43 ` [PATCH 06/55] perf tools: Enable BPF object configure syntax Wang Nan
2016-02-19 11:43 ` [PATCH 07/55] perf record: Apply config to BPF objects before recording Wang Nan
2016-02-19 11:43 ` [PATCH 08/55] perf tools: Enable passing event to BPF object Wang Nan
2016-02-19 11:43 ` [PATCH 09/55] perf tools: Create config_term_names array Wang Nan
2016-02-20 11:36   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-19 11:43 ` [PATCH 10/55] perf stat: Forbid user passing improper config terms Wang Nan
     [not found]   ` <20160219140333.GB16141@kernel.org>
2016-02-19 15:08     ` Arnaldo Carvalho de Melo
2016-02-20 11:37   ` [tip:perf/core] perf stat: Bail out on unsupported event config modifiers tip-bot for Wang Nan
2016-02-19 11:43 ` [PATCH 11/55] perf tools: Rename and move pmu_event_name to get_config_name Wang Nan
2016-02-20 11:37   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-19 11:44 ` [PATCH 12/55] perf tools: Enable config raw and numeric events Wang Nan
     [not found]   ` <20160219141405.GC16141@kernel.org>
2016-02-19 15:08     ` Arnaldo Carvalho de Melo
2016-02-19 15:15       ` Arnaldo Carvalho de Melo
2016-02-19 21:52         ` Arnaldo Carvalho de Melo
2016-02-20 11:38   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-19 11:44 ` [PATCH 13/55] perf tools: Enable config and setting names for legacy cache events Wang Nan
2016-02-20 11:38   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-19 11:44 ` [PATCH 14/55] perf tools: Support setting different slots in a BPF map separately Wang Nan
2016-02-19 11:44 ` [PATCH 15/55] perf tools: Enable indices setting syntax for BPF maps Wang Nan
2016-02-19 11:44 ` [PATCH 16/55] perf tools: Pass tracepoint options to BPF script Wang Nan
2016-02-19 11:44 ` [PATCH 17/55] perf tools: Introduce bpf-output event Wang Nan
2016-02-19 11:44 ` [PATCH 18/55] perf data: Support converting data from bpf_perf_event_output() Wang Nan
2016-02-19 11:44 ` [PATCH 19/55] perf data: Explicitly set byte order for integer types Wang Nan
2016-02-19 11:44 ` [PATCH 20/55] perf core: Introduce new ioctl options to pause and resume ring buffer Wang Nan
2016-02-19 11:44 ` [PATCH 21/55] perf core: Set event's default overflow_handler Wang Nan
2016-02-19 11:44 ` [PATCH 22/55] perf core: Prepare writing into ring buffer from end Wang Nan
2016-02-19 11:44 ` [PATCH 23/55] perf core: Add backward attribute to perf event Wang Nan
2016-02-19 11:44 ` [PATCH 24/55] perf core: Reduce perf event output overhead by new overflow handler Wang Nan
2016-02-19 11:44 ` [PATCH 25/55] perf tools: Only validate is_pos for tracking evsels Wang Nan
2016-02-19 11:44 ` [PATCH 26/55] perf tools: Print write_backward value in perf_event_attr__fprintf Wang Nan
2016-02-19 11:44 ` [PATCH 27/55] perf tools: Make ordered_events reusable Wang Nan
2016-02-19 11:44 ` [PATCH 28/55] perf record: Extract synthesize code to record__synthesize() Wang Nan
2016-02-19 11:44 ` [PATCH 29/55] perf tools: Add perf_data_file__switch() helper Wang Nan
2016-02-19 11:44 ` [PATCH 30/55] perf record: Turns auxtrace_snapshot_enable into 3 states Wang Nan
2016-02-19 11:44 ` [PATCH 31/55] perf record: Introduce record__finish_output() to finish a perf.data Wang Nan
2016-02-19 11:44 ` [PATCH 32/55] perf record: Add '--timestamp-filename' option to append timestamp to output filename Wang Nan
2016-02-19 11:44 ` [PATCH 33/55] perf record: Split output into multiple files via '--switch-output' Wang Nan
2016-02-19 11:44 ` [PATCH 34/55] perf record: Force enable --timestamp-filename when --switch-output is provided Wang Nan
2016-02-19 11:44 ` [PATCH 35/55] perf record: Disable buildid cache options by default in switch output mode Wang Nan
2016-02-19 11:44 ` [PATCH 36/55] perf record: Re-synthesize tracking events after output switching Wang Nan
2016-02-19 11:44 ` [PATCH 37/55] perf record: Generate tracking events for process forked by perf Wang Nan
2016-02-19 11:44 ` [PATCH 38/55] perf record: Ensure return non-zero rc when mmap fail Wang Nan
2016-02-19 11:44 ` [PATCH 39/55] perf record: Prevent reading invalid data in record__mmap_read Wang Nan
2016-02-19 11:44 ` [PATCH 40/55] perf tools: Add evlist channel helpers Wang Nan
2016-02-19 11:44 ` [PATCH 41/55] perf tools: Automatically add new channel according to evlist Wang Nan
2016-02-19 11:44 ` Wang Nan [this message]
2016-02-19 11:44 ` [PATCH 43/55] perf tools: Squash overwrite setting into channel Wang Nan
2016-02-19 11:44 ` [PATCH 44/55] perf record: Don't read from and poll overwrite channel Wang Nan
2016-02-19 11:44 ` [PATCH 45/55] perf record: Don't poll on " Wang Nan
2016-02-19 11:44 ` [PATCH 46/55] perf tools: Detect avalibility of write_backward Wang Nan
2016-02-19 11:44 ` [PATCH 47/55] perf tools: Enable overwrite settings Wang Nan
2016-02-19 11:44 ` [PATCH 48/55] perf tools: Set write_backward attribut bit for overwrite events Wang Nan
2016-02-19 11:44 ` [PATCH 49/55] perf tools: Record fd into perf_mmap Wang Nan
2016-02-19 11:44 ` [PATCH 50/55] perf tools: Add API to pause a channel Wang Nan
2016-02-19 11:44 ` [PATCH 51/55] perf record: Toggle overwrite ring buffer for reading Wang Nan
2016-02-19 11:44 ` [PATCH 52/55] perf record: Rename variable to make code clear Wang Nan
2016-02-19 11:44 ` [PATCH 53/55] perf record: Read from backward ring buffer Wang Nan
2016-02-19 11:44 ` [PATCH 54/55] perf record: Allow generate tracking events at the end of output Wang Nan
2016-02-19 11:44 ` [PATCH 55/55] 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=1455882283-79592-43-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;
as well as URLs for NNTP newsgroup(s).