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>
Cc: Jiri Olsa <jolsa@kernel.org>, Li Zefan <lizefan@huawei.com>,
	"Peter Zijlstra" <peterz@infradead.org>, <pi3orama@163.com>,
	Wang Nan <wangnan0@huawei.com>, <linux-kernel@vger.kernel.org>,
	He Kuang <hekuang@huawei.com>,
	Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
	Namhyung Kim <namhyung@kernel.org>
Subject: [PATCH 34/46] perf tools: Squash overwrite setting into channel
Date: Fri, 26 Feb 2016 09:32:22 +0000	[thread overview]
Message-ID: <1456479154-136027-35-git-send-email-wangnan0@huawei.com> (raw)
In-Reply-To: <1456479154-136027-1-git-send-email-wangnan0@huawei.com>

Make 'overwrite' a channel configuration other than a evlist global
option. With this setting an evlist can have two channels, one is
normal channel, another is overwritable channel.
perf_evlist__channel_for_evsel() ensures events with 'overwrite'
configuration inserted to overwritable channel.

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 |  2 +-
 tools/perf/util/evlist.c    | 42 +++++++++++++++++++++++++++---------------
 tools/perf/util/evlist.h    |  5 ++---
 tools/perf/util/evsel.h     |  1 +
 4 files changed, 31 insertions(+), 19 deletions(-)

diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index d48065f..92eccf1 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -358,7 +358,7 @@ try_again:
 	}
 
 	perf_evlist__channel_reset(evlist);
-	if (perf_evlist__mmap_ex(evlist, opts->mmap_pages, false,
+	if (perf_evlist__mmap_ex(evlist, opts->mmap_pages,
 				 opts->auxtrace_mmap_pages,
 				 opts->auxtrace_snapshot_mode) < 0) {
 		if (errno == EPERM) {
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index c4e3185..067c89d 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -731,7 +731,7 @@ union perf_event *perf_evlist__mmap_read_ex(struct perf_evlist *evlist,
 		return NULL;
 
 	head = perf_mmap__read_head(md);
-	if (evlist->overwrite) {
+	if (perf_evlist__channel_check(evlist, channel, RDONLY)) {
 		/*
 		 * If we're further behind than half the buffer, there's a chance
 		 * the writer will bite our tail and mess up the samples under us.
@@ -820,7 +820,7 @@ void perf_evlist__mmap_consume_ex(struct perf_evlist *evlist,
 		return;
 	}
 
-	if (!evlist->overwrite) {
+	if (!perf_evlist__channel_check(evlist, channel, RDONLY)) {
 		u64 old = md->prev;
 
 		perf_mmap__write_tail(md, old);
@@ -918,7 +918,6 @@ static int perf_evlist__alloc_mmap(struct perf_evlist *evlist)
 }
 
 struct mmap_params {
-	int prot;
 	int mask;
 	struct auxtrace_mmap_params auxtrace_mp;
 };
@@ -926,6 +925,15 @@ struct mmap_params {
 static int __perf_evlist__mmap(struct perf_evlist *evlist, int idx,
 			       struct mmap_params *mp, int fd)
 {
+	int channel = perf_evlist__idx_channel(evlist, idx);
+	int prot = PROT_READ;
+
+	if (channel < 0)
+		return -1;
+
+	if (!perf_evlist__channel_check(evlist, channel, RDONLY))
+		prot |= PROT_WRITE;
+
 	/*
 	 * The last one will be done at perf_evlist__mmap_consume(), so that we
 	 * make sure we don't prevent tools from consuming every last event in
@@ -942,7 +950,7 @@ static int __perf_evlist__mmap(struct perf_evlist *evlist, int idx,
 	atomic_set(&evlist->mmap[idx].refcnt, 2);
 	evlist->mmap[idx].prev = 0;
 	evlist->mmap[idx].mask = mp->mask;
-	evlist->mmap[idx].base = mmap(NULL, evlist->mmap_len, mp->prot,
+	evlist->mmap[idx].base = mmap(NULL, evlist->mmap_len, prot,
 				      MAP_SHARED, fd, 0);
 	if (evlist->mmap[idx].base == MAP_FAILED) {
 		pr_debug2("failed to mmap perf event ring buffer, error %d\n",
@@ -959,9 +967,13 @@ static int __perf_evlist__mmap(struct perf_evlist *evlist, int idx,
 }
 
 static unsigned long
-perf_evlist__channel_for_evsel(struct perf_evsel *evsel __maybe_unused)
+perf_evlist__channel_for_evsel(struct perf_evsel *evsel)
 {
-	return 0;
+	unsigned long flag = 0;
+
+	if (evsel->overwrite)
+		flag |= PERF_EVLIST__CHANNEL_RDONLY;
+	return flag;
 }
 
 static int
@@ -1211,11 +1223,10 @@ int perf_evlist__parse_mmap_pages(const struct option *opt, const char *str,
  * perf_evlist__mmap_ex - Create mmaps to receive events.
  * @evlist: list of events
  * @pages: map length in pages
- * @overwrite: overwrite older events?
  * @auxtrace_pages - auxtrace map length in pages
  * @auxtrace_overwrite - overwrite older auxtrace data?
  *
- * If @overwrite is %false the user needs to signal event consumption using
+ * For writable channel, the user needs to signal event consumption using
  * perf_mmap__write_tail().  Using perf_evlist__mmap_read() does this
  * automatically.
  *
@@ -1225,16 +1236,13 @@ int perf_evlist__parse_mmap_pages(const struct option *opt, const char *str,
  * Return: %0 on success, negative error code otherwise.
  */
 int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages,
-			 bool overwrite, unsigned int auxtrace_pages,
-			 bool auxtrace_overwrite)
+			 unsigned int auxtrace_pages, bool auxtrace_overwrite)
 {
 	int err;
 	struct perf_evsel *evsel;
 	const struct cpu_map *cpus = evlist->cpus;
 	const struct thread_map *threads = evlist->threads;
-	struct mmap_params mp = {
-		.prot = PROT_READ | (overwrite ? 0 : PROT_WRITE),
-	};
+	struct mmap_params mp;
 
 	err = perf_evlist__channel_complete(evlist);
 	if (err)
@@ -1246,7 +1254,6 @@ int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages,
 	if (evlist->pollfd.entries == NULL && perf_evlist__alloc_pollfd(evlist) < 0)
 		return -ENOMEM;
 
-	evlist->overwrite = overwrite;
 	evlist->mmap_len = perf_evlist__mmap_size(pages);
 	pr_debug("mmap size %zuB\n", evlist->mmap_len);
 	mp.mask = evlist->mmap_len - page_size - 1;
@@ -1270,8 +1277,13 @@ int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages,
 int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
 		      bool overwrite)
 {
+	struct perf_evsel *evsel;
+
 	perf_evlist__channel_reset(evlist);
-	return perf_evlist__mmap_ex(evlist, pages, overwrite, 0, false);
+	evlist__for_each(evlist, evsel)
+		evsel->overwrite = overwrite;
+
+	return perf_evlist__mmap_ex(evlist, pages, 0, false);
 }
 
 int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target)
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index b652587..21a8b85 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -23,6 +23,7 @@ struct record_opts;
 #define PERF_EVLIST__NR_CHANNELS	2
 enum perf_evlist_mmap_flag {
 	PERF_EVLIST__CHANNEL_ENABLED	= 1,
+	PERF_EVLIST__CHANNEL_RDONLY	= 2,
 };
 
 /**
@@ -45,7 +46,6 @@ struct perf_evlist {
 	int		 nr_entries;
 	int		 nr_groups;
 	int		 nr_mmaps;
-	bool		 overwrite;
 	bool		 enabled;
 	bool		 has_user_cpus;
 	size_t		 mmap_len;
@@ -203,8 +203,7 @@ int perf_evlist__parse_mmap_pages(const struct option *opt,
 				  int unset);
 
 int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages,
-			 bool overwrite, unsigned int auxtrace_pages,
-			 bool auxtrace_overwrite);
+			 unsigned int auxtrace_pages, bool auxtrace_overwrite);
 int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
 		      bool overwrite);
 void perf_evlist__munmap(struct perf_evlist *evlist);
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index efad78f..03c70e5 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -114,6 +114,7 @@ struct perf_evsel {
 	bool			tracking;
 	bool			per_pkg;
 	bool			precise_max;
+	bool			overwrite;
 	/* parse modifier helper */
 	int			exclude_GH;
 	int			nr_members;
-- 
1.8.3.4

  parent reply	other threads:[~2016-02-26  9:34 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-26  9:31 [PATCH 00/46] perf tools: Fix and improvements (bpf and overwrite) Wang Nan
2016-02-26  9:31 ` [PATCH 01/46] perf tools: Record text offset in dso to calculate objdump address Wang Nan
2016-03-24  7:37   ` [tip:perf/urgent] perf symbols: " tip-bot for Wang Nan
2016-02-26  9:31 ` [PATCH 02/46] perf tools: Adjust symbol for shared objects Wang Nan
2016-02-26  9:31 ` [PATCH 03/46] perf config: Bring perf_default_config to the very beginning at main() Wang Nan
2016-02-27  9:44   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-26  9:31 ` [PATCH 04/46] perf trace: Improve error message when receive non-tracepoint events Wang Nan
2016-02-26  9:31 ` [PATCH 05/46] perf tools: Only set filter for tracepoints events Wang Nan
2016-02-27  9:45   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-26  9:31 ` [PATCH 06/46] perf trace: Call bpf__apply_obj_config in 'perf trace' Wang Nan
2016-02-27  9:45   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-26  9:31 ` [PATCH 07/46] perf trace: Print content of bpf-output event Wang Nan
2016-02-27  9:45   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-26  9:31 ` [PATCH 08/46] perf data: Support converting data from bpf_perf_event_output() Wang Nan
2016-03-05  8:15   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-26  9:31 ` [PATCH 09/46] perf data: Explicitly set byte order for integer types Wang Nan
2016-03-05  8:15   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-26  9:31 ` [PATCH 10/46] perf core: Introduce new ioctl options to pause and resume ring buffer Wang Nan
2016-02-29 15:39   ` Arnaldo Carvalho de Melo
2016-03-03  2:03     ` Wangnan (F)
2016-02-26  9:31 ` [PATCH 11/46] perf core: Set event's default overflow_handler Wang Nan
2016-02-26  9:32 ` [PATCH 12/46] perf core: Prepare writing into ring buffer from end Wang Nan
2016-02-26  9:32 ` [PATCH 13/46] perf core: Add backward attribute to perf event Wang Nan
2016-02-26  9:32 ` [PATCH 14/46] perf core: Reduce perf event output overhead by new overflow handler Wang Nan
2016-02-26  9:32 ` [PATCH 15/46] perf tools: Only validate is_pos for tracking evsels Wang Nan
2016-02-26  9:32 ` [PATCH 16/46] perf tools: Print write_backward value in perf_event_attr__fprintf Wang Nan
2016-02-26  9:32 ` [PATCH 17/46] perf tools: Make ordered_events reusable Wang Nan
2016-02-26  9:32 ` [PATCH 18/46] perf record: Use WARN_ONCE to replace 'if' condition Wang Nan
2016-03-05  8:15   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-26  9:32 ` [PATCH 19/46] perf record: Extract synthesize code to record__synthesize() Wang Nan
2016-03-05  8:16   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-26  9:32 ` [PATCH 20/46] perf tools: Add perf_data_file__switch() helper Wang Nan
2016-02-26  9:32 ` [PATCH 21/46] perf record: Turns auxtrace_snapshot_enable into 3 states Wang Nan
2016-02-26  9:32 ` [PATCH 22/46] perf record: Introduce record__finish_output() to finish a perf.data Wang Nan
2016-03-05  8:16   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-26  9:32 ` [PATCH 23/46] perf record: Add '--timestamp-filename' option to append timestamp to output filename Wang Nan
2016-02-26  9:32 ` [PATCH 24/46] perf record: Split output into multiple files via '--switch-output' Wang Nan
2016-02-26  9:32 ` [PATCH 25/46] perf record: Force enable --timestamp-filename when --switch-output is provided Wang Nan
2016-02-26  9:32 ` [PATCH 26/46] perf record: Disable buildid cache options by default in switch output mode Wang Nan
2016-02-26  9:32 ` [PATCH 27/46] perf record: Re-synthesize tracking events after output switching Wang Nan
2016-02-26  9:32 ` [PATCH 28/46] perf record: Generate tracking events for process forked by perf Wang Nan
2016-02-26  9:32 ` [PATCH 29/46] perf record: Ensure return non-zero rc when mmap fail Wang Nan
2016-03-05  8:17   ` [tip:perf/core] " tip-bot for Wang Nan
2016-02-26  9:32 ` [PATCH 30/46] perf record: Prevent reading invalid data in record__mmap_read Wang Nan
2016-02-26  9:32 ` [PATCH 31/46] perf tools: Add evlist channel helpers Wang Nan
2016-02-26  9:32 ` [PATCH 32/46] perf tools: Automatically add new channel according to evlist Wang Nan
2016-02-26  9:32 ` [PATCH 33/46] perf tools: Operate multiple channels Wang Nan
2016-02-26  9:32 ` Wang Nan [this message]
2016-02-26  9:32 ` [PATCH 35/46] perf record: Don't read from and poll overwrite channel Wang Nan
2016-02-26  9:32 ` [PATCH 36/46] perf record: Don't poll on " Wang Nan
2016-02-26  9:32 ` [PATCH 37/46] perf tools: Detect avalibility of write_backward Wang Nan
2016-02-26  9:32 ` [PATCH 38/46] perf tools: Enable overwrite settings Wang Nan
2016-02-26  9:32 ` [PATCH 39/46] perf tools: Set write_backward attribut bit for overwrite events Wang Nan
2016-02-26  9:32 ` [PATCH 40/46] perf tools: Record fd into perf_mmap Wang Nan
2016-02-26  9:32 ` [PATCH 41/46] perf tools: Add API to pause a channel Wang Nan
2016-02-26  9:32 ` [PATCH 42/46] perf record: Toggle overwrite ring buffer for reading Wang Nan
2016-02-26  9:32 ` [PATCH 43/46] perf record: Rename variable to make code clear Wang Nan
2016-02-26  9:32 ` [PATCH 44/46] perf record: Read from backward ring buffer Wang Nan
2016-02-26  9:32 ` [PATCH 45/46] perf record: Allow generate tracking events at the end of output Wang Nan
2016-02-26  9:32 ` [PATCH 46/46] 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=1456479154-136027-35-git-send-email-wangnan0@huawei.com \
    --to=wangnan0@huawei.com \
    --cc=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=ast@kernel.org \
    --cc=hekuang@huawei.com \
    --cc=jolsa@kernel.org \
    --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

Powered by JetHome