perf evlist: Expose perf_event_mlock_kb_in_pages() helper
When the user doesn't set --mmap-pages, perf_evlist__mmap() will do it by reading the maximum possible for a non-root user from the /proc/sys/kernel/perf_event_mlock_kb file. Expose that function so that 'perf trace' can, for root users, to bump mmap-pages to a higher value for root, based on the contents of this proc file. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Milian Wolff <milian.wolff@kdab.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/n/tip-xay69plylwibpb3l4isrpl1k@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
0561499326
commit
f5e7150cd9
|
@ -986,26 +986,34 @@ static int perf_evlist__mmap_per_thread(struct perf_evlist *evlist,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long perf_event_mlock_kb_in_pages(void)
|
||||||
|
{
|
||||||
|
unsigned long pages;
|
||||||
|
int max;
|
||||||
|
|
||||||
|
if (sysctl__read_int("kernel/perf_event_mlock_kb", &max) < 0) {
|
||||||
|
/*
|
||||||
|
* Pick a once upon a time good value, i.e. things look
|
||||||
|
* strange since we can't read a sysctl value, but lets not
|
||||||
|
* die yet...
|
||||||
|
*/
|
||||||
|
max = 512;
|
||||||
|
} else {
|
||||||
|
max -= (page_size / 1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
pages = (max * 1024) / page_size;
|
||||||
|
if (!is_power_of_2(pages))
|
||||||
|
pages = rounddown_pow_of_two(pages);
|
||||||
|
|
||||||
|
return pages;
|
||||||
|
}
|
||||||
|
|
||||||
static size_t perf_evlist__mmap_size(unsigned long pages)
|
static size_t perf_evlist__mmap_size(unsigned long pages)
|
||||||
{
|
{
|
||||||
if (pages == UINT_MAX) {
|
if (pages == UINT_MAX)
|
||||||
int max;
|
pages = perf_event_mlock_kb_in_pages();
|
||||||
|
else if (!is_power_of_2(pages))
|
||||||
if (sysctl__read_int("kernel/perf_event_mlock_kb", &max) < 0) {
|
|
||||||
/*
|
|
||||||
* Pick a once upon a time good value, i.e. things look
|
|
||||||
* strange since we can't read a sysctl value, but lets not
|
|
||||||
* die yet...
|
|
||||||
*/
|
|
||||||
max = 512;
|
|
||||||
} else {
|
|
||||||
max -= (page_size / 1024);
|
|
||||||
}
|
|
||||||
|
|
||||||
pages = (max * 1024) / page_size;
|
|
||||||
if (!is_power_of_2(pages))
|
|
||||||
pages = rounddown_pow_of_two(pages);
|
|
||||||
} else if (!is_power_of_2(pages))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return (pages + 1) * page_size;
|
return (pages + 1) * page_size;
|
||||||
|
|
|
@ -158,6 +158,8 @@ int perf_evlist__parse_mmap_pages(const struct option *opt,
|
||||||
const char *str,
|
const char *str,
|
||||||
int unset);
|
int unset);
|
||||||
|
|
||||||
|
unsigned long perf_event_mlock_kb_in_pages(void);
|
||||||
|
|
||||||
int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages,
|
int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages,
|
||||||
bool overwrite, unsigned int auxtrace_pages,
|
bool overwrite, unsigned int auxtrace_pages,
|
||||||
bool auxtrace_overwrite);
|
bool auxtrace_overwrite);
|
||||||
|
|
Loading…
Reference in New Issue