aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorNelson Elhage <nelhage@nelhage.com>2011-12-19 08:39:32 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2011-12-23 13:53:58 -0500
commit41d0d933494ce10eb77758a1168b08e317c42e8e (patch)
treef907773714846b5b5cf85b4f450bb6fe07b168d4 /tools
parent18e6093904abfd51671ff5846c2fdaba9ebbf21b (diff)
perf: builtin-record: Document and check that mmap_pages must be a power of two.
Now that we automatically point users at it, let's provide them some guidance so that they hopefully don't just get mysterious EINVAL's from the kernel. Cc: Ingo Molnar <mingo@elte.hu> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1324301972-22740-4-git-send-email-nelhage@nelhage.com Signed-off-by: Nelson Elhage <nelhage@nelhage.com> [ committer note: Made it work after 50a682c ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/perf/Documentation/perf-record.txt2
-rw-r--r--tools/perf/builtin-record.c3
-rw-r--r--tools/perf/util/evlist.c2
-rw-r--r--tools/perf/util/util.h11
4 files changed, 17 insertions, 1 deletions
diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
index 5a520f825295..2937f7e14bb7 100644
--- a/tools/perf/Documentation/perf-record.txt
+++ b/tools/perf/Documentation/perf-record.txt
@@ -89,7 +89,7 @@ OPTIONS
89 89
90-m:: 90-m::
91--mmap-pages=:: 91--mmap-pages=::
92 Number of mmap data pages. 92 Number of mmap data pages. Must be a power of two.
93 93
94-g:: 94-g::
95--call-graph:: 95--call-graph::
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 56bb4476e3ba..e873ae2dd54c 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -279,6 +279,9 @@ try_again:
279 "/proc/sys/kernel/perf_event_mlock_kb,\n" 279 "/proc/sys/kernel/perf_event_mlock_kb,\n"
280 "or try again with a smaller value of -m/--mmap_pages.\n" 280 "or try again with a smaller value of -m/--mmap_pages.\n"
281 "(current value: %d)\n", opts->mmap_pages); 281 "(current value: %d)\n", opts->mmap_pages);
282 else if (!is_power_of_2(opts->mmap_pages))
283 die("--mmap_pages/-m value must be a power of two.");
284
282 die("failed to mmap with %d (%s)\n", errno, strerror(errno)); 285 die("failed to mmap with %d (%s)\n", errno, strerror(errno));
283 } 286 }
284 287
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index 963d63dde457..fa1837088ca8 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -563,6 +563,8 @@ int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
563 /* 512 kiB: default amount of unprivileged mlocked memory */ 563 /* 512 kiB: default amount of unprivileged mlocked memory */
564 if (pages == UINT_MAX) 564 if (pages == UINT_MAX)
565 pages = (512 * 1024) / page_size; 565 pages = (512 * 1024) / page_size;
566 else if (!is_power_of_2(pages))
567 return -EINVAL;
566 568
567 mask = pages * page_size - 1; 569 mask = pages * page_size - 1;
568 570
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index 0128906bac88..37be34dff798 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -245,4 +245,15 @@ int readn(int fd, void *buf, size_t size);
245#define _STR(x) #x 245#define _STR(x) #x
246#define STR(x) _STR(x) 246#define STR(x) _STR(x)
247 247
248/*
249 * Determine whether some value is a power of two, where zero is
250 * *not* considered a power of two.
251 */
252
253static inline __attribute__((const))
254bool is_power_of_2(unsigned long n)
255{
256 return (n != 0 && ((n & (n - 1)) == 0));
257}
258
248#endif 259#endif