diff mbox series

[v2,2/2] alloc_tag: outline and export free_reserved_page()

Message ID 20240717181239.2510054-2-surenb@google.com (mailing list archive)
State New
Headers show
Series [v2,1/2] alloc_tag: export mem_alloc_profiling_key used by modules | expand

Commit Message

Suren Baghdasaryan July 17, 2024, 6:12 p.m. UTC
Outline and export free_reserved_page() because modules use it and it
in turn uses page_ext_{get|put} which should not be exported. The same
result could be obtained by outlining {get|put}_page_tag_ref() but that
would have higher performance impact as these functions are used in
more performance critical paths.

Fixes: dcfe378c81f7 ("lib: introduce support for page allocation tagging")
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202407080044.DWMC9N9I-lkp@intel.com/
Suggested-by: Christoph Hellwig <hch@infradead.org>
Suggested-by: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
---
Changes since v1 [1]
- Outlined and exported free_reserved_page() in place of {get|put}_page_tag_ref,
per Vlastimil Babka

[1] https://lore.kernel.org/all/20240717011631.2150066-2-surenb@google.com/

 include/linux/mm.h | 16 +---------------
 mm/page_alloc.c    | 17 +++++++++++++++++
 2 files changed, 18 insertions(+), 15 deletions(-)

Comments

Vlastimil Babka July 17, 2024, 7:35 p.m. UTC | #1
On 7/17/24 8:12 PM, Suren Baghdasaryan wrote:
> Outline and export free_reserved_page() because modules use it and it
> in turn uses page_ext_{get|put} which should not be exported. The same
> result could be obtained by outlining {get|put}_page_tag_ref() but that
> would have higher performance impact as these functions are used in
> more performance critical paths.
> 
> Fixes: dcfe378c81f7 ("lib: introduce support for page allocation tagging")
> Reported-by: kernel test robot <lkp@intel.com>
> Closes: https://lore.kernel.org/oe-kbuild-all/202407080044.DWMC9N9I-lkp@intel.com/
> Suggested-by: Christoph Hellwig <hch@infradead.org>
> Suggested-by: Vlastimil Babka <vbabka@suse.cz>
> Signed-off-by: Suren Baghdasaryan <surenb@google.com>

Acked-by: Vlastimil Babka <vbabka@suse.cz>

Are these two patches now stable@ material as 6.10 build is broken on ppc64
with alloc taging enabled?

> ---
> Changes since v1 [1]
> - Outlined and exported free_reserved_page() in place of {get|put}_page_tag_ref,
> per Vlastimil Babka
> 
> [1] https://lore.kernel.org/all/20240717011631.2150066-2-surenb@google.com/
> 
>  include/linux/mm.h | 16 +---------------
>  mm/page_alloc.c    | 17 +++++++++++++++++
>  2 files changed, 18 insertions(+), 15 deletions(-)
> 
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index eb7c96d24ac0..b58bad248eef 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -3177,21 +3177,7 @@ extern void reserve_bootmem_region(phys_addr_t start,
>  				   phys_addr_t end, int nid);
>  
>  /* Free the reserved page into the buddy system, so it gets managed. */
> -static inline void free_reserved_page(struct page *page)
> -{
> -	if (mem_alloc_profiling_enabled()) {
> -		union codetag_ref *ref = get_page_tag_ref(page);
> -
> -		if (ref) {
> -			set_codetag_empty(ref);
> -			put_page_tag_ref(ref);
> -		}
> -	}
> -	ClearPageReserved(page);
> -	init_page_count(page);
> -	__free_page(page);
> -	adjust_managed_page_count(page, 1);
> -}
> +void free_reserved_page(struct page *page);
>  #define free_highmem_page(page) free_reserved_page(page)
>  
>  static inline void mark_page_reserved(struct page *page)
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 9ecf99190ea2..7d2fa9f5e750 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -5805,6 +5805,23 @@ unsigned long free_reserved_area(void *start, void *end, int poison, const char
>  	return pages;
>  }
>  
> +void free_reserved_page(struct page *page)
> +{
> +	if (mem_alloc_profiling_enabled()) {
> +		union codetag_ref *ref = get_page_tag_ref(page);
> +
> +		if (ref) {
> +			set_codetag_empty(ref);
> +			put_page_tag_ref(ref);
> +		}
> +	}
> +	ClearPageReserved(page);
> +	init_page_count(page);
> +	__free_page(page);
> +	adjust_managed_page_count(page, 1);
> +}
> +EXPORT_SYMBOL(free_reserved_page);
> +
>  static int page_alloc_cpu_dead(unsigned int cpu)
>  {
>  	struct zone *zone;
Suren Baghdasaryan July 17, 2024, 8:04 p.m. UTC | #2
On Wed, Jul 17, 2024 at 12:36 PM Vlastimil Babka <vbabka@suse.cz> wrote:
>
> On 7/17/24 8:12 PM, Suren Baghdasaryan wrote:
> > Outline and export free_reserved_page() because modules use it and it
> > in turn uses page_ext_{get|put} which should not be exported. The same
> > result could be obtained by outlining {get|put}_page_tag_ref() but that
> > would have higher performance impact as these functions are used in
> > more performance critical paths.
> >
> > Fixes: dcfe378c81f7 ("lib: introduce support for page allocation tagging")
> > Reported-by: kernel test robot <lkp@intel.com>
> > Closes: https://lore.kernel.org/oe-kbuild-all/202407080044.DWMC9N9I-lkp@intel.com/
> > Suggested-by: Christoph Hellwig <hch@infradead.org>
> > Suggested-by: Vlastimil Babka <vbabka@suse.cz>
> > Signed-off-by: Suren Baghdasaryan <surenb@google.com>
>
> Acked-by: Vlastimil Babka <vbabka@suse.cz>
>
> Are these two patches now stable@ material as 6.10 build is broken on ppc64
> with alloc taging enabled?

I tested them with that specific configuration mentioned in the bug
report and with several usual ones I use.
Yeah, I guess from now on all such fixes should have

Cc: stable@vger.kernel.org # v6.10

>
> > ---
> > Changes since v1 [1]
> > - Outlined and exported free_reserved_page() in place of {get|put}_page_tag_ref,
> > per Vlastimil Babka
> >
> > [1] https://lore.kernel.org/all/20240717011631.2150066-2-surenb@google.com/
> >
> >  include/linux/mm.h | 16 +---------------
> >  mm/page_alloc.c    | 17 +++++++++++++++++
> >  2 files changed, 18 insertions(+), 15 deletions(-)
> >
> > diff --git a/include/linux/mm.h b/include/linux/mm.h
> > index eb7c96d24ac0..b58bad248eef 100644
> > --- a/include/linux/mm.h
> > +++ b/include/linux/mm.h
> > @@ -3177,21 +3177,7 @@ extern void reserve_bootmem_region(phys_addr_t start,
> >                                  phys_addr_t end, int nid);
> >
> >  /* Free the reserved page into the buddy system, so it gets managed. */
> > -static inline void free_reserved_page(struct page *page)
> > -{
> > -     if (mem_alloc_profiling_enabled()) {
> > -             union codetag_ref *ref = get_page_tag_ref(page);
> > -
> > -             if (ref) {
> > -                     set_codetag_empty(ref);
> > -                     put_page_tag_ref(ref);
> > -             }
> > -     }
> > -     ClearPageReserved(page);
> > -     init_page_count(page);
> > -     __free_page(page);
> > -     adjust_managed_page_count(page, 1);
> > -}
> > +void free_reserved_page(struct page *page);
> >  #define free_highmem_page(page) free_reserved_page(page)
> >
> >  static inline void mark_page_reserved(struct page *page)
> > diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> > index 9ecf99190ea2..7d2fa9f5e750 100644
> > --- a/mm/page_alloc.c
> > +++ b/mm/page_alloc.c
> > @@ -5805,6 +5805,23 @@ unsigned long free_reserved_area(void *start, void *end, int poison, const char
> >       return pages;
> >  }
> >
> > +void free_reserved_page(struct page *page)
> > +{
> > +     if (mem_alloc_profiling_enabled()) {
> > +             union codetag_ref *ref = get_page_tag_ref(page);
> > +
> > +             if (ref) {
> > +                     set_codetag_empty(ref);
> > +                     put_page_tag_ref(ref);
> > +             }
> > +     }
> > +     ClearPageReserved(page);
> > +     init_page_count(page);
> > +     __free_page(page);
> > +     adjust_managed_page_count(page, 1);
> > +}
> > +EXPORT_SYMBOL(free_reserved_page);
> > +
> >  static int page_alloc_cpu_dead(unsigned int cpu)
> >  {
> >       struct zone *zone;
>
Vlastimil Babka July 17, 2024, 8:19 p.m. UTC | #3
On 7/17/24 10:04 PM, Suren Baghdasaryan wrote:
> On Wed, Jul 17, 2024 at 12:36 PM Vlastimil Babka <vbabka@suse.cz> wrote:
>>
>> On 7/17/24 8:12 PM, Suren Baghdasaryan wrote:
>> > Outline and export free_reserved_page() because modules use it and it
>> > in turn uses page_ext_{get|put} which should not be exported. The same
>> > result could be obtained by outlining {get|put}_page_tag_ref() but that
>> > would have higher performance impact as these functions are used in
>> > more performance critical paths.
>> >
>> > Fixes: dcfe378c81f7 ("lib: introduce support for page allocation tagging")
>> > Reported-by: kernel test robot <lkp@intel.com>
>> > Closes: https://lore.kernel.org/oe-kbuild-all/202407080044.DWMC9N9I-lkp@intel.com/
>> > Suggested-by: Christoph Hellwig <hch@infradead.org>
>> > Suggested-by: Vlastimil Babka <vbabka@suse.cz>
>> > Signed-off-by: Suren Baghdasaryan <surenb@google.com>
>>
>> Acked-by: Vlastimil Babka <vbabka@suse.cz>
>>
>> Are these two patches now stable@ material as 6.10 build is broken on ppc64
>> with alloc taging enabled?
> 
> I tested them with that specific configuration mentioned in the bug
> report and with several usual ones I use.
> Yeah, I guess from now on all such fixes should have
> 
> Cc: stable@vger.kernel.org # v6.10

Right. BTW I have just realized that the way you did Patch 2/2 and outlined
the whole free_reserved_page() (which is fair, it's an init-time function),
mem_alloc_profiling_enabled() didn't stay inlined so Patch 1/2 is in fact
not necessary anymore?
Suren Baghdasaryan July 17, 2024, 9:20 p.m. UTC | #4
On Wed, Jul 17, 2024 at 1:19 PM Vlastimil Babka <vbabka@suse.cz> wrote:
>
> On 7/17/24 10:04 PM, Suren Baghdasaryan wrote:
> > On Wed, Jul 17, 2024 at 12:36 PM Vlastimil Babka <vbabka@suse.cz> wrote:
> >>
> >> On 7/17/24 8:12 PM, Suren Baghdasaryan wrote:
> >> > Outline and export free_reserved_page() because modules use it and it
> >> > in turn uses page_ext_{get|put} which should not be exported. The same
> >> > result could be obtained by outlining {get|put}_page_tag_ref() but that
> >> > would have higher performance impact as these functions are used in
> >> > more performance critical paths.
> >> >
> >> > Fixes: dcfe378c81f7 ("lib: introduce support for page allocation tagging")
> >> > Reported-by: kernel test robot <lkp@intel.com>
> >> > Closes: https://lore.kernel.org/oe-kbuild-all/202407080044.DWMC9N9I-lkp@intel.com/
> >> > Suggested-by: Christoph Hellwig <hch@infradead.org>
> >> > Suggested-by: Vlastimil Babka <vbabka@suse.cz>
> >> > Signed-off-by: Suren Baghdasaryan <surenb@google.com>
> >>
> >> Acked-by: Vlastimil Babka <vbabka@suse.cz>
> >>
> >> Are these two patches now stable@ material as 6.10 build is broken on ppc64
> >> with alloc taging enabled?
> >
> > I tested them with that specific configuration mentioned in the bug
> > report and with several usual ones I use.
> > Yeah, I guess from now on all such fixes should have
> >
> > Cc: stable@vger.kernel.org # v6.10
>
> Right. BTW I have just realized that the way you did Patch 2/2 and outlined
> the whole free_reserved_page() (which is fair, it's an init-time function),
> mem_alloc_profiling_enabled() didn't stay inlined so Patch 1/2 is in fact
> not necessary anymore?

Yeah, I think you are right, currently no module has reasons to use
mem_alloc_profiling_enabled() directly. That might change in the
future but we can add the export at the time it's needed.
I checked and ppc64 build passes with just this patch. Let me post v3
with just this patch and Cc stable@.


>
>
>
Suren Baghdasaryan July 17, 2024, 9:30 p.m. UTC | #5
On Wed, Jul 17, 2024 at 2:20 PM Suren Baghdasaryan <surenb@google.com> wrote:
>
> On Wed, Jul 17, 2024 at 1:19 PM Vlastimil Babka <vbabka@suse.cz> wrote:
> >
> > On 7/17/24 10:04 PM, Suren Baghdasaryan wrote:
> > > On Wed, Jul 17, 2024 at 12:36 PM Vlastimil Babka <vbabka@suse.cz> wrote:
> > >>
> > >> On 7/17/24 8:12 PM, Suren Baghdasaryan wrote:
> > >> > Outline and export free_reserved_page() because modules use it and it
> > >> > in turn uses page_ext_{get|put} which should not be exported. The same
> > >> > result could be obtained by outlining {get|put}_page_tag_ref() but that
> > >> > would have higher performance impact as these functions are used in
> > >> > more performance critical paths.
> > >> >
> > >> > Fixes: dcfe378c81f7 ("lib: introduce support for page allocation tagging")
> > >> > Reported-by: kernel test robot <lkp@intel.com>
> > >> > Closes: https://lore.kernel.org/oe-kbuild-all/202407080044.DWMC9N9I-lkp@intel.com/
> > >> > Suggested-by: Christoph Hellwig <hch@infradead.org>
> > >> > Suggested-by: Vlastimil Babka <vbabka@suse.cz>
> > >> > Signed-off-by: Suren Baghdasaryan <surenb@google.com>
> > >>
> > >> Acked-by: Vlastimil Babka <vbabka@suse.cz>
> > >>
> > >> Are these two patches now stable@ material as 6.10 build is broken on ppc64
> > >> with alloc taging enabled?
> > >
> > > I tested them with that specific configuration mentioned in the bug
> > > report and with several usual ones I use.
> > > Yeah, I guess from now on all such fixes should have
> > >
> > > Cc: stable@vger.kernel.org # v6.10
> >
> > Right. BTW I have just realized that the way you did Patch 2/2 and outlined
> > the whole free_reserved_page() (which is fair, it's an init-time function),
> > mem_alloc_profiling_enabled() didn't stay inlined so Patch 1/2 is in fact
> > not necessary anymore?
>
> Yeah, I think you are right, currently no module has reasons to use
> mem_alloc_profiling_enabled() directly. That might change in the
> future but we can add the export at the time it's needed.
> I checked and ppc64 build passes with just this patch. Let me post v3
> with just this patch and Cc stable@.

v3 posted at https://lore.kernel.org/all/20240717212844.2749975-1-surenb@google.com/

>
>
> >
> >
> >
diff mbox series

Patch

diff --git a/include/linux/mm.h b/include/linux/mm.h
index eb7c96d24ac0..b58bad248eef 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -3177,21 +3177,7 @@  extern void reserve_bootmem_region(phys_addr_t start,
 				   phys_addr_t end, int nid);
 
 /* Free the reserved page into the buddy system, so it gets managed. */
-static inline void free_reserved_page(struct page *page)
-{
-	if (mem_alloc_profiling_enabled()) {
-		union codetag_ref *ref = get_page_tag_ref(page);
-
-		if (ref) {
-			set_codetag_empty(ref);
-			put_page_tag_ref(ref);
-		}
-	}
-	ClearPageReserved(page);
-	init_page_count(page);
-	__free_page(page);
-	adjust_managed_page_count(page, 1);
-}
+void free_reserved_page(struct page *page);
 #define free_highmem_page(page) free_reserved_page(page)
 
 static inline void mark_page_reserved(struct page *page)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 9ecf99190ea2..7d2fa9f5e750 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5805,6 +5805,23 @@  unsigned long free_reserved_area(void *start, void *end, int poison, const char
 	return pages;
 }
 
+void free_reserved_page(struct page *page)
+{
+	if (mem_alloc_profiling_enabled()) {
+		union codetag_ref *ref = get_page_tag_ref(page);
+
+		if (ref) {
+			set_codetag_empty(ref);
+			put_page_tag_ref(ref);
+		}
+	}
+	ClearPageReserved(page);
+	init_page_count(page);
+	__free_page(page);
+	adjust_managed_page_count(page, 1);
+}
+EXPORT_SYMBOL(free_reserved_page);
+
 static int page_alloc_cpu_dead(unsigned int cpu)
 {
 	struct zone *zone;