Commit 0f4ccd11 authored by Wang Nan's avatar Wang Nan Committed by Arnaldo Carvalho de Melo

perf evlist: Extract perf_mmap__read()

Extract event reader from perf_evlist__mmap_read() to perf__mmap_read().
Future commit will feed it with manually computed 'head' and 'old'
pointers.
Signed-off-by: default avatarWang 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/1461723563-67451-2-git-send-email-wangnan0@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 0b3c2264
...@@ -679,24 +679,15 @@ static struct perf_evsel *perf_evlist__event2evsel(struct perf_evlist *evlist, ...@@ -679,24 +679,15 @@ static struct perf_evsel *perf_evlist__event2evsel(struct perf_evlist *evlist,
return NULL; return NULL;
} }
union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx) static union perf_event *
perf_mmap__read(struct perf_mmap *md, bool overwrite, u64 head,
u64 old, u64 *prev)
{ {
struct perf_mmap *md = &evlist->mmap[idx];
u64 head;
u64 old = md->prev;
int diff;
unsigned char *data = md->base + page_size; unsigned char *data = md->base + page_size;
union perf_event *event = NULL; union perf_event *event = NULL;
int diff = head - old;
/* if (overwrite) {
* Check if event was unmapped due to a POLLHUP/POLLERR.
*/
if (!atomic_read(&md->refcnt))
return NULL;
head = perf_mmap__read_head(md);
diff = head - old;
if (evlist->overwrite) {
/* /*
* If we're further behind than half the buffer, there's a chance * 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. * the writer will bite our tail and mess up the samples under us.
...@@ -751,11 +742,29 @@ union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx) ...@@ -751,11 +742,29 @@ union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx)
} }
broken_event: broken_event:
md->prev = old; if (prev)
*prev = old;
return event; return event;
} }
union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx)
{
struct perf_mmap *md = &evlist->mmap[idx];
u64 head;
u64 old = 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);
return perf_mmap__read(md, evlist->overwrite, head, old, &md->prev);
}
static bool perf_mmap__empty(struct perf_mmap *md) static bool perf_mmap__empty(struct perf_mmap *md)
{ {
return perf_mmap__read_head(md) == md->prev && !md->auxtrace_mmap.base; return perf_mmap__read_head(md) == md->prev && !md->auxtrace_mmap.base;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment