From: Pankaj Raghav <p.raghav@samsung.com>
Add largest_zero_folio() routine so that huge_zero_folio can be
used directly when CONFIG_STATIC_HUGE_ZERO_FOLIO is enabled. This will
return ZERO_PAGE folio if CONFIG_STATIC_HUGE_ZERO_FOLIO is disabled or
if we failed to allocate a huge_zero_folio.
Co-developed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Pankaj Raghav <p.raghav@samsung.com>
---
include/linux/huge_mm.h | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h
index 78ebceb61d0e..c44a6736704b 100644
--- a/include/linux/huge_mm.h
+++ b/include/linux/huge_mm.h
@@ -716,4 +716,21 @@ static inline int split_folio_to_order(struct folio *folio, int new_order)
return split_folio_to_list_to_order(folio, NULL, new_order);
}
+/*
+ * largest_zero_folio - Get the largest zero size folio available
+ *
+ * This function will return huge_zero_folio if CONFIG_STATIC_HUGE_ZERO_FOLIO
+ * is enabled. Otherwise, a ZERO_PAGE folio is returned.
+ *
+ * Deduce the size of the folio with folio_size instead of assuming the
+ * folio size.
+ */
+static inline struct folio *largest_zero_folio(void)
+{
+ struct folio *folio = get_static_huge_zero_folio();
+
+ if (folio)
+ return folio;
+ return page_folio(ZERO_PAGE(0));
+}
#endif /* _LINUX_HUGE_MM_H */
--
2.49.0
On Mon, Aug 04, 2025 at 02:13:55PM +0200, Pankaj Raghav (Samsung) wrote: > From: Pankaj Raghav <p.raghav@samsung.com> > > Add largest_zero_folio() routine so that huge_zero_folio can be > used directly when CONFIG_STATIC_HUGE_ZERO_FOLIO is enabled. This will > return ZERO_PAGE folio if CONFIG_STATIC_HUGE_ZERO_FOLIO is disabled or > if we failed to allocate a huge_zero_folio. > > Co-developed-by: David Hildenbrand <david@redhat.com> > Signed-off-by: David Hildenbrand <david@redhat.com> > Signed-off-by: Pankaj Raghav <p.raghav@samsung.com> This looks good to me minus nit + comment below, so: Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > --- > include/linux/huge_mm.h | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > index 78ebceb61d0e..c44a6736704b 100644 > --- a/include/linux/huge_mm.h > +++ b/include/linux/huge_mm.h > @@ -716,4 +716,21 @@ static inline int split_folio_to_order(struct folio *folio, int new_order) > return split_folio_to_list_to_order(folio, NULL, new_order); > } > > +/* Maybe let's make this a kernel doc comment? > + * largest_zero_folio - Get the largest zero size folio available > + * > + * This function will return huge_zero_folio if CONFIG_STATIC_HUGE_ZERO_FOLIO > + * is enabled. Otherwise, a ZERO_PAGE folio is returned. > + * > + * Deduce the size of the folio with folio_size instead of assuming the > + * folio size. > + */ > +static inline struct folio *largest_zero_folio(void) > +{ > + struct folio *folio = get_static_huge_zero_folio(); > + > + if (folio) > + return folio; > + return page_folio(ZERO_PAGE(0)); Feels like we should have this in a wrapper function somewhere. Then again it seems people generally always open-code 'ZERO_PAGE(0)' anyway so maybe this is sort of the 'way things are done'? :P > +} > #endif /* _LINUX_HUGE_MM_H */ > -- > 2.49.0 >
On Mon, Aug 04, 2025 at 05:50:46PM +0100, Lorenzo Stoakes wrote: > On Mon, Aug 04, 2025 at 02:13:55PM +0200, Pankaj Raghav (Samsung) wrote: > > From: Pankaj Raghav <p.raghav@samsung.com> > > > > Add largest_zero_folio() routine so that huge_zero_folio can be > > used directly when CONFIG_STATIC_HUGE_ZERO_FOLIO is enabled. This will > > return ZERO_PAGE folio if CONFIG_STATIC_HUGE_ZERO_FOLIO is disabled or > > if we failed to allocate a huge_zero_folio. > > > > Co-developed-by: David Hildenbrand <david@redhat.com> > > Signed-off-by: David Hildenbrand <david@redhat.com> > > Signed-off-by: Pankaj Raghav <p.raghav@samsung.com> > > This looks good to me minus nit + comment below, so: > > Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > Thanks. > > --- > > include/linux/huge_mm.h | 17 +++++++++++++++++ > > 1 file changed, 17 insertions(+) > > > > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > > index 78ebceb61d0e..c44a6736704b 100644 > > --- a/include/linux/huge_mm.h > > +++ b/include/linux/huge_mm.h > > @@ -716,4 +716,21 @@ static inline int split_folio_to_order(struct folio *folio, int new_order) > > return split_folio_to_list_to_order(folio, NULL, new_order); > > } > > > > +/* > > Maybe let's make this a kernel doc comment? Yes, I will change it in the next version :) > > > + * largest_zero_folio - Get the largest zero size folio available > > + * > > + * This function will return huge_zero_folio if CONFIG_STATIC_HUGE_ZERO_FOLIO > > + * is enabled. Otherwise, a ZERO_PAGE folio is returned. > > + * > > + * Deduce the size of the folio with folio_size instead of assuming the > > + * folio size. > > + */ > > +static inline struct folio *largest_zero_folio(void) > > +{ > > + struct folio *folio = get_static_huge_zero_folio(); > > + > > + if (folio) > > + return folio; > > + return page_folio(ZERO_PAGE(0)); > > Feels like we should have this in a wrapper function somewhere. Then again it > seems people generally always open-code 'ZERO_PAGE(0)' anyway so maybe this is > sort of the 'way things are done'? :P > > > +} > > #endif /* _LINUX_HUGE_MM_H */ > > -- > > 2.49.0 > >
On 4 Aug 2025, at 8:13, Pankaj Raghav (Samsung) wrote: > From: Pankaj Raghav <p.raghav@samsung.com> > > Add largest_zero_folio() routine so that huge_zero_folio can be > used directly when CONFIG_STATIC_HUGE_ZERO_FOLIO is enabled. This will > return ZERO_PAGE folio if CONFIG_STATIC_HUGE_ZERO_FOLIO is disabled or > if we failed to allocate a huge_zero_folio. > > Co-developed-by: David Hildenbrand <david@redhat.com> > Signed-off-by: David Hildenbrand <david@redhat.com> > Signed-off-by: Pankaj Raghav <p.raghav@samsung.com> > --- > include/linux/huge_mm.h | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > Reviewed-by: Zi Yan <ziy@nvidia.com> Best Regards, Yan, Zi
On 8/4/25 05:13, Pankaj Raghav (Samsung) wrote: > From: Pankaj Raghav <p.raghav@samsung.com> > > Add largest_zero_folio() routine so that huge_zero_folio can be > used directly when CONFIG_STATIC_HUGE_ZERO_FOLIO is enabled. This will > return ZERO_PAGE folio if CONFIG_STATIC_HUGE_ZERO_FOLIO is disabled or > if we failed to allocate a huge_zero_folio. This changelog is telling a lot of the "what" but none of the "why". The existing huge zero folio API is for users that have an mm. This is *only* for folks that want a huge zero folio but don't have an mm. That's _why_ this function is needed. It's in this series because there was no way to get a huge zero folio before the permanent one was introduced in this series. Can we please get some of that into the function comment and changelog? It's critical. > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > index 78ebceb61d0e..c44a6736704b 100644 > --- a/include/linux/huge_mm.h > +++ b/include/linux/huge_mm.h > @@ -716,4 +716,21 @@ static inline int split_folio_to_order(struct folio *folio, int new_order) > return split_folio_to_list_to_order(folio, NULL, new_order); > } > > +/* > + * largest_zero_folio - Get the largest zero size folio available > + * > + * This function will return huge_zero_folio if CONFIG_STATIC_HUGE_ZERO_FOLIO > + * is enabled. Otherwise, a ZERO_PAGE folio is returned. > + * > + * Deduce the size of the folio with folio_size instead of assuming the > + * folio size. > + */ This comment needs to get fleshed out. It at _least_ needs to say something along the lines of: Use this when a huge zero folio is needed but there is no mm lifetime to tie it to. Basically, use this when you can't use mm_get_huge_zero_folio(). > +static inline struct folio *largest_zero_folio(void) > +{ > + struct folio *folio = get_static_huge_zero_folio(); > + > + if (folio) > + return folio; There needs to be a newline in here. > + return page_folio(ZERO_PAGE(0)); > +} > #endif /* _LINUX_HUGE_MM_H */ The code is fine, but the changelog and comments need quite a bit of work.
On Tue, Aug 05, 2025 at 09:42:14AM -0700, Dave Hansen wrote: > On 8/4/25 05:13, Pankaj Raghav (Samsung) wrote: > > From: Pankaj Raghav <p.raghav@samsung.com> > > > > Add largest_zero_folio() routine so that huge_zero_folio can be > > used directly when CONFIG_STATIC_HUGE_ZERO_FOLIO is enabled. This will > > return ZERO_PAGE folio if CONFIG_STATIC_HUGE_ZERO_FOLIO is disabled or > > if we failed to allocate a huge_zero_folio. > > This changelog is telling a lot of the "what" but none of the "why". > > The existing huge zero folio API is for users that have an mm. This is > *only* for folks that want a huge zero folio but don't have an mm. > That's _why_ this function is needed. It's in this series because there > was no way to get a huge zero folio before the permanent one was > introduced in this series. > > Can we please get some of that into the function comment and changelog? > It's critical. Valid point. I will include that in the next version. > > > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > > index 78ebceb61d0e..c44a6736704b 100644 > > --- a/include/linux/huge_mm.h > > +++ b/include/linux/huge_mm.h > > @@ -716,4 +716,21 @@ static inline int split_folio_to_order(struct folio *folio, int new_order) > > return split_folio_to_list_to_order(folio, NULL, new_order); > > } > > > > +/* > > + * largest_zero_folio - Get the largest zero size folio available > > + * > > + * This function will return huge_zero_folio if CONFIG_STATIC_HUGE_ZERO_FOLIO > > + * is enabled. Otherwise, a ZERO_PAGE folio is returned. > > + * > > + * Deduce the size of the folio with folio_size instead of assuming the > > + * folio size. > > + */ > > This comment needs to get fleshed out. It at _least_ needs to say > something along the lines of: > > Use this when a huge zero folio is needed but there is no mm > lifetime to tie it to. Basically, use this when you can't use > mm_get_huge_zero_folio(). > Agreed. > > +static inline struct folio *largest_zero_folio(void) > > +{ > > + struct folio *folio = get_static_huge_zero_folio(); > > + > > + if (folio) > > + return folio; > > There needs to be a newline in here. > > > + return page_folio(ZERO_PAGE(0)); > > +} > > #endif /* _LINUX_HUGE_MM_H */ > > The code is fine, but the changelog and comments need quite a bit of work. Sounds good to me. I will make the changes. Thanks Dave. -- Pankaj
© 2016 - 2025 Red Hat, Inc.