linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).