diff options
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/Documentation/perf-record.txt | 2 | ||||
-rw-r--r-- | tools/perf/builtin-record.c | 3 | ||||
-rw-r--r-- | tools/perf/util/evlist.c | 2 | ||||
-rw-r--r-- | tools/perf/util/util.h | 11 |
4 files changed, 17 insertions, 1 deletions
diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt index 5a520f82529..2937f7e14bb 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 56bb4476e3b..e873ae2dd54 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 963d63dde45..fa1837088ca 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 0128906bac8..37be34dff79 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 | |||
253 | static inline __attribute__((const)) | ||
254 | bool is_power_of_2(unsigned long n) | ||
255 | { | ||
256 | return (n != 0 && ((n & (n - 1)) == 0)); | ||
257 | } | ||
258 | |||
248 | #endif | 259 | #endif |