* [PATCH v2] perf/core: Fix perf_mmap fail when CONFIG_PERF_USE_VMALLOC enabled
@ 2022-02-09 14:54 Zhipeng Xie
2022-02-16 16:54 ` PING: " Zhipeng Xie
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Zhipeng Xie @ 2022-02-09 14:54 UTC (permalink / raw)
To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa, namhyung
Cc: linux-perf-users, linux-kernel, xiezhipeng1, xiexiuqi, fanwentao
This problem can be reproduced with CONFIG_PERF_USE_VMALLOC enabled on both
x86_64 and aarch64 arch when using sysdig -B(using ebpf)[1].
sysdig -B works fine after rebuilding the kernel with CONFIG_PERF_USE_VMALLOC
disabled.
I tracked it down to the if condition event->rb->nr_pages != nr_pages in
perf_mmap is true when CONFIG_PERF_USE_VMALLOC is enabled where
event->rb->nr_pages = 1 and nr_pages = 2048 resulting perf_mmap to return
-EINVAL.This is because when CONFIG_PERF_USE_VMALLOC is enabled, rb->nr_pages
is always equal to 1.
Arch with CONFIG_PERF_USE_VMALLOC enabled by default:
arc/arm/csky/mips/sh/sparc/xtensa
Arch with CONFIG_PERF_USE_VMALLOC disabled by default:
x86_64/aarch64/...
Fix this problem by using data_page_nr.
[1] https://github.com/draios/sysdig
Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
---
kernel/events/core.c | 2 +-
kernel/events/internal.h | 5 +++++
kernel/events/ring_buffer.c | 5 -----
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 57c7197838db..370292effd32 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -6352,7 +6352,7 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)
again:
mutex_lock(&event->mmap_mutex);
if (event->rb) {
- if (event->rb->nr_pages != nr_pages) {
+ if (data_page_nr(event->rb) != nr_pages) {
ret = -EINVAL;
goto unlock;
}
diff --git a/kernel/events/internal.h b/kernel/events/internal.h
index 082832738c8f..5816c0719dbf 100644
--- a/kernel/events/internal.h
+++ b/kernel/events/internal.h
@@ -116,6 +116,11 @@ static inline int page_order(struct perf_buffer *rb)
}
#endif
+static int data_page_nr(struct perf_buffer *rb)
+{
+ return rb->nr_pages << page_order(rb);
+}
+
static inline unsigned long perf_data_size(struct perf_buffer *rb)
{
return rb->nr_pages << (PAGE_SHIFT + page_order(rb));
diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
index 52868716ec35..fb35b926024c 100644
--- a/kernel/events/ring_buffer.c
+++ b/kernel/events/ring_buffer.c
@@ -859,11 +859,6 @@ void rb_free(struct perf_buffer *rb)
}
#else
-static int data_page_nr(struct perf_buffer *rb)
-{
- return rb->nr_pages << page_order(rb);
-}
-
static struct page *
__perf_mmap_to_page(struct perf_buffer *rb, unsigned long pgoff)
{
--
2.18.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* PING: [PATCH v2] perf/core: Fix perf_mmap fail when CONFIG_PERF_USE_VMALLOC enabled
2022-02-09 14:54 [PATCH v2] perf/core: Fix perf_mmap fail when CONFIG_PERF_USE_VMALLOC enabled Zhipeng Xie
@ 2022-02-16 16:54 ` Zhipeng Xie
2022-03-18 1:19 ` Zhipeng Xie
2022-04-14 15:16 ` Peter Zijlstra
2022-04-19 19:34 ` [tip: perf/urgent] " tip-bot2 for Zhipeng Xie
2 siblings, 1 reply; 5+ messages in thread
From: Zhipeng Xie @ 2022-02-16 16:54 UTC (permalink / raw)
To: peterz
Cc: acme, alexander.shishkin, fanwentao, jolsa, linux-kernel,
linux-perf-users, mark.rutland, mingo, namhyung, xiezhipeng1,
xiexiuqi
Hi, Peter
Could you please review the V2 version?
On Wed, February 9, 2022 10:54 PM, Zhipeng Xie wrote:
> This problem can be reproduced with CONFIG_PERF_USE_VMALLOC enabled
> on both
> x86_64 and aarch64 arch when using sysdig -B(using ebpf)[1].
> sysdig -B works fine after rebuilding the kernel with
> CONFIG_PERF_USE_VMALLOC
> disabled.
>
> I tracked it down to the if condition event->rb->nr_pages != nr_pages in
> perf_mmap is true when CONFIG_PERF_USE_VMALLOC is enabled where
> event->rb->nr_pages = 1 and nr_pages = 2048 resulting perf_mmap to return
> -EINVAL.This is because when CONFIG_PERF_USE_VMALLOC is enabled,
> rb->nr_pages
> is always equal to 1.
>
> Arch with CONFIG_PERF_USE_VMALLOC enabled by default:
> arc/arm/csky/mips/sh/sparc/xtensa
> Arch with CONFIG_PERF_USE_VMALLOC disabled by default:
> x86_64/aarch64/...
>
> Fix this problem by using data_page_nr.
>
> [1] https://github.com/draios/sysdig
>
> Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
> ---
> kernel/events/core.c | 2 +-
> kernel/events/internal.h | 5 +++++
> kernel/events/ring_buffer.c | 5 -----
> 3 files changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index 57c7197838db..370292effd32 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -6352,7 +6352,7 @@ static int perf_mmap(struct file *file, struct
> vm_area_struct *vma)
> again:
> mutex_lock(&event->mmap_mutex);
> if (event->rb) {
> - if (event->rb->nr_pages != nr_pages) {
> + if (data_page_nr(event->rb) != nr_pages) {
> ret = -EINVAL;
> goto unlock;
> }
> diff --git a/kernel/events/internal.h b/kernel/events/internal.h
> index 082832738c8f..5816c0719dbf 100644
> --- a/kernel/events/internal.h
> +++ b/kernel/events/internal.h
> @@ -116,6 +116,11 @@ static inline int page_order(struct perf_buffer *rb)
> }
> #endif
>
> +static int data_page_nr(struct perf_buffer *rb)
> +{
> + return rb->nr_pages << page_order(rb);
> +}
> +
> static inline unsigned long perf_data_size(struct perf_buffer *rb)
> {
> return rb->nr_pages << (PAGE_SHIFT + page_order(rb));
> diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
> index 52868716ec35..fb35b926024c 100644
> --- a/kernel/events/ring_buffer.c
> +++ b/kernel/events/ring_buffer.c
> @@ -859,11 +859,6 @@ void rb_free(struct perf_buffer *rb)
> }
>
> #else
> -static int data_page_nr(struct perf_buffer *rb)
> -{
> - return rb->nr_pages << page_order(rb);
> -}
> -
> static struct page *
> __perf_mmap_to_page(struct perf_buffer *rb, unsigned long pgoff)
> {
> --
> 2.18.1
Best Regards,
Zhipeng Xie
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: PING: [PATCH v2] perf/core: Fix perf_mmap fail when CONFIG_PERF_USE_VMALLOC enabled
2022-02-16 16:54 ` PING: " Zhipeng Xie
@ 2022-03-18 1:19 ` Zhipeng Xie
0 siblings, 0 replies; 5+ messages in thread
From: Zhipeng Xie @ 2022-03-18 1:19 UTC (permalink / raw)
To: peterz
Cc: acme, alexander.shishkin, fanwentao, jolsa, linux-kernel,
linux-perf-users, mark.rutland, mingo, namhyung, xiezhipeng1,
xiexiuqi
Ping again, sorry for the noise.
On Thu, February 17, 2022 12:54 AM, Zhipeng Xie wrote:
>
> Hi, Peter
>
> Could you please review the V2 version?
>
> On Wed, February 9, 2022 10:54 PM, Zhipeng Xie wrote:
> > This problem can be reproduced with CONFIG_PERF_USE_VMALLOC enabled
> > on both
> > x86_64 and aarch64 arch when using sysdig -B(using ebpf)[1].
> > sysdig -B works fine after rebuilding the kernel with
> > CONFIG_PERF_USE_VMALLOC
> > disabled.
> >
> > I tracked it down to the if condition event->rb->nr_pages != nr_pages in
> > perf_mmap is true when CONFIG_PERF_USE_VMALLOC is enabled where
> > event->rb->nr_pages = 1 and nr_pages = 2048 resulting perf_mmap to return
> > -EINVAL.This is because when CONFIG_PERF_USE_VMALLOC is enabled,
> > rb->nr_pages
> > is always equal to 1.
> >
> > Arch with CONFIG_PERF_USE_VMALLOC enabled by default:
> > arc/arm/csky/mips/sh/sparc/xtensa
> > Arch with CONFIG_PERF_USE_VMALLOC disabled by default:
> > x86_64/aarch64/...
> >
> > Fix this problem by using data_page_nr.
> >
> > [1] https://github.com/draios/sysdig
> >
> > Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
> > ---
> > kernel/events/core.c | 2 +-
> > kernel/events/internal.h | 5 +++++
> > kernel/events/ring_buffer.c | 5 -----
> > 3 files changed, 6 insertions(+), 6 deletions(-)
> >
> > diff --git a/kernel/events/core.c b/kernel/events/core.c
> > index 57c7197838db..370292effd32 100644
> > --- a/kernel/events/core.c
> > +++ b/kernel/events/core.c
> > @@ -6352,7 +6352,7 @@ static int perf_mmap(struct file *file, struct
> > vm_area_struct *vma)
> > again:
> > mutex_lock(&event->mmap_mutex);
> > if (event->rb) {
> > - if (event->rb->nr_pages != nr_pages) {
> > + if (data_page_nr(event->rb) != nr_pages) {
> > ret = -EINVAL;
> > goto unlock;
> > }
> > diff --git a/kernel/events/internal.h b/kernel/events/internal.h
> > index 082832738c8f..5816c0719dbf 100644
> > --- a/kernel/events/internal.h
> > +++ b/kernel/events/internal.h
> > @@ -116,6 +116,11 @@ static inline int page_order(struct perf_buffer *rb)
> > }
> > #endif
> >
> > +static int data_page_nr(struct perf_buffer *rb)
> > +{
> > + return rb->nr_pages << page_order(rb);
> > +}
> > +
> > static inline unsigned long perf_data_size(struct perf_buffer *rb)
> > {
> > return rb->nr_pages << (PAGE_SHIFT + page_order(rb));
> > diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
> > index 52868716ec35..fb35b926024c 100644
> > --- a/kernel/events/ring_buffer.c
> > +++ b/kernel/events/ring_buffer.c
> > @@ -859,11 +859,6 @@ void rb_free(struct perf_buffer *rb)
> > }
> >
> > #else
> > -static int data_page_nr(struct perf_buffer *rb)
> > -{
> > - return rb->nr_pages << page_order(rb);
> > -}
> > -
> > static struct page *
> > __perf_mmap_to_page(struct perf_buffer *rb, unsigned long pgoff)
> > {
> > --
> > 2.18.1
>
> Best Regards,
> Zhipeng Xie
Best Regards,
Zhipeng Xie
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] perf/core: Fix perf_mmap fail when CONFIG_PERF_USE_VMALLOC enabled
2022-02-09 14:54 [PATCH v2] perf/core: Fix perf_mmap fail when CONFIG_PERF_USE_VMALLOC enabled Zhipeng Xie
2022-02-16 16:54 ` PING: " Zhipeng Xie
@ 2022-04-14 15:16 ` Peter Zijlstra
2022-04-19 19:34 ` [tip: perf/urgent] " tip-bot2 for Zhipeng Xie
2 siblings, 0 replies; 5+ messages in thread
From: Peter Zijlstra @ 2022-04-14 15:16 UTC (permalink / raw)
To: Zhipeng Xie
Cc: mingo, acme, mark.rutland, alexander.shishkin, jolsa, namhyung,
linux-perf-users, linux-kernel, xiexiuqi, fanwentao
On Wed, Feb 09, 2022 at 09:54:17AM -0500, Zhipeng Xie wrote:
> This problem can be reproduced with CONFIG_PERF_USE_VMALLOC enabled on both
> x86_64 and aarch64 arch when using sysdig -B(using ebpf)[1].
> sysdig -B works fine after rebuilding the kernel with CONFIG_PERF_USE_VMALLOC
> disabled.
>
> I tracked it down to the if condition event->rb->nr_pages != nr_pages in
> perf_mmap is true when CONFIG_PERF_USE_VMALLOC is enabled where
> event->rb->nr_pages = 1 and nr_pages = 2048 resulting perf_mmap to return
> -EINVAL.This is because when CONFIG_PERF_USE_VMALLOC is enabled, rb->nr_pages
> is always equal to 1.
>
> Arch with CONFIG_PERF_USE_VMALLOC enabled by default:
> arc/arm/csky/mips/sh/sparc/xtensa
> Arch with CONFIG_PERF_USE_VMALLOC disabled by default:
> x86_64/aarch64/...
>
> Fix this problem by using data_page_nr.
>
> [1] https://github.com/draios/sysdig
>
> Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
Right; sorry for being tardy. Fix looks ok, but I tihnk it needs:
Fixes: 906010b2134e ("perf_event: Provide vmalloc() based mmap() backing")
Will go queue.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [tip: perf/urgent] perf/core: Fix perf_mmap fail when CONFIG_PERF_USE_VMALLOC enabled
2022-02-09 14:54 [PATCH v2] perf/core: Fix perf_mmap fail when CONFIG_PERF_USE_VMALLOC enabled Zhipeng Xie
2022-02-16 16:54 ` PING: " Zhipeng Xie
2022-04-14 15:16 ` Peter Zijlstra
@ 2022-04-19 19:34 ` tip-bot2 for Zhipeng Xie
2 siblings, 0 replies; 5+ messages in thread
From: tip-bot2 for Zhipeng Xie @ 2022-04-19 19:34 UTC (permalink / raw)
To: linux-tip-commits; +Cc: Zhipeng Xie, Peter Zijlstra (Intel), x86, linux-kernel
The following commit has been merged into the perf/urgent branch of tip:
Commit-ID: 60490e7966659b26d74bf1fa4aa8693d9a94ca88
Gitweb: https://git.kernel.org/tip/60490e7966659b26d74bf1fa4aa8693d9a94ca88
Author: Zhipeng Xie <xiezhipeng1@huawei.com>
AuthorDate: Wed, 09 Feb 2022 09:54:17 -05:00
Committer: Peter Zijlstra <peterz@infradead.org>
CommitterDate: Tue, 19 Apr 2022 21:15:42 +02:00
perf/core: Fix perf_mmap fail when CONFIG_PERF_USE_VMALLOC enabled
This problem can be reproduced with CONFIG_PERF_USE_VMALLOC enabled on
both x86_64 and aarch64 arch when using sysdig -B(using ebpf)[1].
sysdig -B works fine after rebuilding the kernel with
CONFIG_PERF_USE_VMALLOC disabled.
I tracked it down to the if condition event->rb->nr_pages != nr_pages
in perf_mmap is true when CONFIG_PERF_USE_VMALLOC is enabled where
event->rb->nr_pages = 1 and nr_pages = 2048 resulting perf_mmap to
return -EINVAL. This is because when CONFIG_PERF_USE_VMALLOC is
enabled, rb->nr_pages is always equal to 1.
Arch with CONFIG_PERF_USE_VMALLOC enabled by default:
arc/arm/csky/mips/sh/sparc/xtensa
Arch with CONFIG_PERF_USE_VMALLOC disabled by default:
x86_64/aarch64/...
Fix this problem by using data_page_nr()
[1] https://github.com/draios/sysdig
Fixes: 906010b2134e ("perf_event: Provide vmalloc() based mmap() backing")
Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20220209145417.6495-1-xiezhipeng1@huawei.com
---
kernel/events/core.c | 2 +-
kernel/events/internal.h | 5 +++++
kernel/events/ring_buffer.c | 5 -----
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 23bb197..7858baf 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -6247,7 +6247,7 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)
again:
mutex_lock(&event->mmap_mutex);
if (event->rb) {
- if (event->rb->nr_pages != nr_pages) {
+ if (data_page_nr(event->rb) != nr_pages) {
ret = -EINVAL;
goto unlock;
}
diff --git a/kernel/events/internal.h b/kernel/events/internal.h
index 0828327..5150d5f 100644
--- a/kernel/events/internal.h
+++ b/kernel/events/internal.h
@@ -116,6 +116,11 @@ static inline int page_order(struct perf_buffer *rb)
}
#endif
+static inline int data_page_nr(struct perf_buffer *rb)
+{
+ return rb->nr_pages << page_order(rb);
+}
+
static inline unsigned long perf_data_size(struct perf_buffer *rb)
{
return rb->nr_pages << (PAGE_SHIFT + page_order(rb));
diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
index 5286871..fb35b92 100644
--- a/kernel/events/ring_buffer.c
+++ b/kernel/events/ring_buffer.c
@@ -859,11 +859,6 @@ void rb_free(struct perf_buffer *rb)
}
#else
-static int data_page_nr(struct perf_buffer *rb)
-{
- return rb->nr_pages << page_order(rb);
-}
-
static struct page *
__perf_mmap_to_page(struct perf_buffer *rb, unsigned long pgoff)
{
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-04-19 19:35 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-09 14:54 [PATCH v2] perf/core: Fix perf_mmap fail when CONFIG_PERF_USE_VMALLOC enabled Zhipeng Xie
2022-02-16 16:54 ` PING: " Zhipeng Xie
2022-03-18 1:19 ` Zhipeng Xie
2022-04-14 15:16 ` Peter Zijlstra
2022-04-19 19:34 ` [tip: perf/urgent] " tip-bot2 for Zhipeng Xie
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).