Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8872481b authored by Kan Liang's avatar Kan Liang Committed by Arnaldo Carvalho de Melo
Browse files

perf mmap: Introduce perf_mmap__read_init()



The new function perf_mmap__read_init() is factored out from
perf_mmap__push().

It is to calculate the 'start' and 'end' of the available data in
ringbuffer.

No functional change.

Signed-off-by: default avatarKan Liang <kan.liang@intel.com>
Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1516310792-208685-5-git-send-email-kan.liang@intel.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent f92c8cbe
Loading
Loading
Loading
Loading
+27 −10
Original line number Diff line number Diff line
@@ -267,24 +267,24 @@ static int overwrite_rb_find_range(void *buf, int mask, u64 head, u64 *start, u6
	return -1;
}

int perf_mmap__push(struct perf_mmap *md, bool overwrite,
		    void *to, int push(void *to, void *buf, size_t size))
/*
 * Report the start and end of the available data in ringbuffer
 */
int perf_mmap__read_init(struct perf_mmap *md, bool overwrite,
			 u64 *startp, u64 *endp)
{
	u64 head = perf_mmap__read_head(md);
	u64 old = md->prev;
	u64 end, start;
	unsigned char *data = md->base + page_size;
	unsigned long size;
	void *buf;
	int rc = 0;

	start = overwrite ? head : old;
	end = overwrite ? old : head;
	*startp = overwrite ? head : old;
	*endp = overwrite ? old : head;

	if (start == end)
	if (*startp == *endp)
		return 0;

	size = end - start;
	size = *endp - *startp;
	if (size > (unsigned long)(md->mask) + 1) {
		if (!overwrite) {
			WARN_ONCE(1, "failed to keep up with mmap data. (warn only once)\n");
@@ -298,10 +298,27 @@ int perf_mmap__push(struct perf_mmap *md, bool overwrite,
		 * Backward ring buffer is full. We still have a chance to read
		 * most of data from it.
		 */
		if (overwrite_rb_find_range(data, md->mask, head, &start, &end))
		if (overwrite_rb_find_range(data, md->mask, head, startp, endp))
			return -1;
	}

	return 1;
}

int perf_mmap__push(struct perf_mmap *md, bool overwrite,
		    void *to, int push(void *to, void *buf, size_t size))
{
	u64 head = perf_mmap__read_head(md);
	u64 end, start;
	unsigned char *data = md->base + page_size;
	unsigned long size;
	void *buf;
	int rc = 0;

	rc = perf_mmap__read_init(md, overwrite, &start, &end);
	if (rc < 1)
		return rc;

	size = end - start;

	if ((start & md->mask) + size != (end & md->mask)) {
+2 −0
Original line number Diff line number Diff line
@@ -94,4 +94,6 @@ int perf_mmap__push(struct perf_mmap *md, bool backward,

size_t perf_mmap__mmap_len(struct perf_mmap *map);

int perf_mmap__read_init(struct perf_mmap *md, bool overwrite,
			 u64 *startp, u64 *endp);
#endif /*__PERF_MMAP_H */