Commit-ID: 528871b456026e6127d95b1b2bd8e3a003dc1614 Gitweb: https://git.kernel.org/tip/528871b456026e6127d95b1b2bd8e3a003dc1614 Author: Ingo Molnar mingo@kernel.org AuthorDate: Wed, 13 Feb 2019 07:57:02 +0100 Committer: Ingo Molnar mingo@kernel.org CommitDate: Wed, 13 Feb 2019 08:05:02 +0100
perf/core: Fix impossible ring-buffer sizes warning
The following commit:
9dff0aa95a32 ("perf/core: Don't WARN() for impossible ring-buffer sizes")
results in perf recording failures with larger mmap areas:
root@skl:/tmp# perf record -g -a failed to mmap with 12 (Cannot allocate memory)
The root cause is that the following condition is buggy:
if (order_base_2(size) >= MAX_ORDER) goto fail;
The problem is that @size is in bytes and MAX_ORDER is in pages, so the right test is:
if (order_base_2(size) >= PAGE_SHIFT+MAX_ORDER) goto fail;
Fix it.
Reported-by: "Jin, Yao" yao.jin@linux.intel.com Bisected-by: Borislav Petkov bp@alien8.de Analyzed-by: Peter Zijlstra peterz@infradead.org Cc: Julien Thierry julien.thierry@arm.com Cc: Mark Rutland mark.rutland@arm.com Cc: Alexander Shishkin alexander.shishkin@linux.intel.com Cc: Arnaldo Carvalho de Melo acme@redhat.com Cc: Jiri Olsa jolsa@redhat.com Cc: Linus Torvalds torvalds@linux-foundation.org Cc: Namhyung Kim namhyung@kernel.org Cc: Peter Zijlstra peterz@infradead.org Cc: Thomas Gleixner tglx@linutronix.de Cc: Greg Kroah-Hartman gregkh@linuxfoundation.org Cc: stable@vger.kernel.org Fixes: 9dff0aa95a32 ("perf/core: Don't WARN() for impossible ring-buffer sizes") Signed-off-by: Ingo Molnar mingo@kernel.org --- kernel/events/ring_buffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c index 309ef5a64af5..5ab4fe3b1dcc 100644 --- a/kernel/events/ring_buffer.c +++ b/kernel/events/ring_buffer.c @@ -734,7 +734,7 @@ struct ring_buffer *rb_alloc(int nr_pages, long watermark, int cpu, int flags) size = sizeof(struct ring_buffer); size += nr_pages * sizeof(void *);
- if (order_base_2(size) >= MAX_ORDER) + if (order_base_2(size) >= PAGE_SHIFT+MAX_ORDER) goto fail;
rb = kzalloc(size, GFP_KERNEL);
linux-stable-mirror@lists.linaro.org