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

Commit 27050f53 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo
Browse files

perf tools: Add possibility to specify mmap size



Adding possibility to specify mmap size via -m/--mmap-pages
by appending unit size character (B/K/M/G) to the
number, like:
  $ perf record -m 8K ls
  $ perf record -m 2M ls

The size is rounded up appropriately to follow perf
mmap restrictions.

If no unit is specified the number provides pages as
of now, like:
  $ perf record -m 8 ls

Signed-off-by: default avatarJiri Olsa <jolsa@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1378031796-17892-3-git-send-email-jolsa@redhat.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 994a1f78
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -109,7 +109,9 @@ STAT LIVE OPTIONS

-m::
--mmap-pages=::
    Number of mmap data pages. Must be a power of two.
    Number of mmap data pages (must be a power of two) or size
    specification with appended unit character - B/K/M/G. The
    size is rounded up to have nearest pages power of two value.

-a::
--all-cpus::
+3 −1
Original line number Diff line number Diff line
@@ -87,7 +87,9 @@ OPTIONS

-m::
--mmap-pages=::
	Number of mmap data pages. Must be a power of two.
	Number of mmap data pages (must be a power of two) or size
	specification with appended unit character - B/K/M/G. The
	size is rounded up to have nearest pages power of two value.

-g::
--call-graph::
+3 −1
Original line number Diff line number Diff line
@@ -68,7 +68,9 @@ Default is to monitor all CPUS.

-m <pages>::
--mmap-pages=<pages>::
	Number of mmapped data pages.
	Number of mmap data pages (must be a power of two) or size
	specification with appended unit character - B/K/M/G. The
	size is rounded up to have nearest pages power of two value.

-p <pid>::
--pid=<pid>::
+3 −1
Original line number Diff line number Diff line
@@ -59,7 +59,9 @@ OPTIONS

-m::
--mmap-pages=::
	Number of mmap data pages. Must be a power of two.
	Number of mmap data pages (must be a power of two) or size
	specification with appended unit character - B/K/M/G. The
	size is rounded up to have nearest pages power of two value.

-C::
--cpu::
+26 −6
Original line number Diff line number Diff line
@@ -687,15 +687,34 @@ static size_t perf_evlist__mmap_size(unsigned long pages)
int perf_evlist__parse_mmap_pages(const struct option *opt, const char *str,
				  int unset __maybe_unused)
{
	unsigned int pages, *mmap_pages = opt->value;
	unsigned int pages, val, *mmap_pages = opt->value;
	size_t size;
	char *eptr;
	static struct parse_tag tags[] = {
		{ .tag  = 'B', .mult = 1       },
		{ .tag  = 'K', .mult = 1 << 10 },
		{ .tag  = 'M', .mult = 1 << 20 },
		{ .tag  = 'G', .mult = 1 << 30 },
		{ .tag  = 0 },
	};

	val = parse_tag_value(str, tags);
	if (val != (unsigned int) -1) {
		/* we got file size value */
		pages = PERF_ALIGN(val, page_size) / page_size;
		if (!is_power_of_2(pages)) {
			pages = next_pow2(pages);
			pr_info("rounding mmap pages size to %u (%u pages)\n",
				pages * page_size, pages);
		}
	} else {
		/* we got pages count value */
		char *eptr;
		pages = strtoul(str, &eptr, 10);
		if (*eptr != '\0') {
			pr_err("failed to parse --mmap_pages/-m value\n");
			return -1;
		}
	}

	size = perf_evlist__mmap_size(pages);
	if (!size) {
@@ -738,6 +757,7 @@ int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,

	evlist->overwrite = overwrite;
	evlist->mmap_len = perf_evlist__mmap_size(pages);
	pr_debug("mmap size %luB\n", evlist->mmap_len);
	mask = evlist->mmap_len - page_size - 1;

	list_for_each_entry(evsel, &evlist->entries, node) {
Loading