All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org, Wang Nan <wangnan0@huawei.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Zefan Li <lizefan@huawei.com>,
	pi3orama@163.com, Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 04/15] perf tools: Support reading from backward ring buffer
Date: Tue, 10 May 2016 12:15:14 -0300	[thread overview]
Message-ID: <1462893325-28646-5-git-send-email-acme@kernel.org> (raw)
In-Reply-To: <1462893325-28646-1-git-send-email-acme@kernel.org>

From: Wang Nan <wangnan0@huawei.com>

perf_evlist__mmap_read_backward() is introduced for reading backward
ring buffer. Since direction for reading such ring buffer is different
from the direction kernel writing to it, and since user need to fetch
most recent record from it, a perf_evlist__mmap_read_catchup() is
introduced to move the reading pointer to the end of the buffer.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1462758471-89706-2-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/evlist.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++
 tools/perf/util/evlist.h |  4 ++++
 2 files changed, 54 insertions(+)

diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index 17cd01421e7f..c4bfe11479a0 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -766,6 +766,56 @@ union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx)
 	return perf_mmap__read(md, evlist->overwrite, old, head, &md->prev);
 }
 
+union perf_event *
+perf_evlist__mmap_read_backward(struct perf_evlist *evlist, int idx)
+{
+	struct perf_mmap *md = &evlist->mmap[idx];
+	u64 head, end;
+	u64 start = md->prev;
+
+	/*
+	 * Check if event was unmapped due to a POLLHUP/POLLERR.
+	 */
+	if (!atomic_read(&md->refcnt))
+		return NULL;
+
+	head = perf_mmap__read_head(md);
+	if (!head)
+		return NULL;
+
+	/*
+	 * 'head' pointer starts from 0. Kernel minus sizeof(record) form
+	 * it each time when kernel writes to it, so in fact 'head' is
+	 * negative. 'end' pointer is made manually by adding the size of
+	 * the ring buffer to 'head' pointer, means the validate data can
+	 * read is the whole ring buffer. If 'end' is positive, the ring
+	 * buffer has not fully filled, so we must adjust 'end' to 0.
+	 *
+	 * However, since both 'head' and 'end' is unsigned, we can't
+	 * simply compare 'end' against 0. Here we compare '-head' and
+	 * the size of the ring buffer, where -head is the number of bytes
+	 * kernel write to the ring buffer.
+	 */
+	if (-head < (u64)(md->mask + 1))
+		end = 0;
+	else
+		end = head + md->mask + 1;
+
+	return perf_mmap__read(md, false, start, end, &md->prev);
+}
+
+void perf_evlist__mmap_read_catchup(struct perf_evlist *evlist, int idx)
+{
+	struct perf_mmap *md = &evlist->mmap[idx];
+	u64 head;
+
+	if (!atomic_read(&md->refcnt))
+		return;
+
+	head = perf_mmap__read_head(md);
+	md->prev = head;
+}
+
 static bool perf_mmap__empty(struct perf_mmap *md)
 {
 	return perf_mmap__read_head(md) == md->prev && !md->auxtrace_mmap.base;
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index 208897a646ca..85d1b59802e8 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -129,6 +129,10 @@ struct perf_sample_id *perf_evlist__id2sid(struct perf_evlist *evlist, u64 id);
 
 union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx);
 
+union perf_event *perf_evlist__mmap_read_backward(struct perf_evlist *evlist,
+						  int idx);
+void perf_evlist__mmap_read_catchup(struct perf_evlist *evlist, int idx);
+
 void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx);
 
 int perf_evlist__open(struct perf_evlist *evlist);
-- 
2.5.5

  parent reply	other threads:[~2016-05-10 15:16 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-10 15:15 [GIT PULL 00/15] perf/core improvements and fixes Arnaldo Carvalho de Melo
2016-05-10 15:15 ` [PATCH 01/15] perf callchain: Recording 'dwarf' callchains do not need DWARF unwinding support Arnaldo Carvalho de Melo
2016-05-10 15:15 ` [PATCH 02/15] perf stat: Scale values by unit before metrics Arnaldo Carvalho de Melo
2016-05-10 15:15 ` [PATCH 03/15] perf script: Fix incorrect python db-export error message Arnaldo Carvalho de Melo
2016-05-10 15:15 ` Arnaldo Carvalho de Melo [this message]
2016-05-10 15:15 ` [PATCH 05/15] perf tests: Add test to check backward ring buffer Arnaldo Carvalho de Melo
2016-05-10 15:15 ` [PATCH 06/15] perf evsel: Print state of perf_event_attr.write_backward Arnaldo Carvalho de Melo
2016-05-10 15:15 ` [PATCH 07/15] perf symbols: Fix handling of zero-length symbols Arnaldo Carvalho de Melo
2016-05-10 15:15 ` [PATCH 08/15] perf tools: Rewrite strbuf not to die() Arnaldo Carvalho de Melo
2016-05-10 15:15 ` [PATCH 09/15] perf probe: Check the return value of strbuf APIs Arnaldo Carvalho de Melo
2016-05-10 15:15 ` [PATCH 10/15] perf help: Make check_emacsclient_version to check " Arnaldo Carvalho de Melo
2016-05-10 15:15 ` [PATCH 11/15] perf tools: Make alias handler to check return value of strbuf Arnaldo Carvalho de Melo
2016-05-10 15:15 ` [PATCH 12/15] perf header: Make topology checkers " Arnaldo Carvalho de Melo
2016-05-10 15:15 ` [PATCH 13/15] perf pmu: Make pmu_formats_string " Arnaldo Carvalho de Melo
2016-05-10 15:15 ` [PATCH 14/15] perf help: Do not use ALLOC_GROW in add_cmd_list Arnaldo Carvalho de Melo
2016-05-10 15:15 ` [PATCH 15/15] perf tools: Remove xrealloc and ALLOC_GROW Arnaldo Carvalho de Melo
2016-05-10 20:28 ` [GIT PULL 00/15] 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=1462893325-28646-5-git-send-email-acme@kernel.org \
    --to=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizefan@huawei.com \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=pi3orama@163.com \
    --cc=wangnan0@huawei.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.