Message ID | 20230825190436.55045-8-mike.kravetz@oracle.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Batch hugetlb vmemmap modification operations | expand |
Hi Mike, kernel test robot noticed the following build errors: [auto build test ERROR on next-20230825] [cannot apply to akpm-mm/mm-everything v6.5-rc7 v6.5-rc6 v6.5-rc5 linus/master v6.5-rc7] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Mike-Kravetz/hugetlb-clear-flags-in-tail-pages-that-will-be-freed-individually/20230826-030805 base: next-20230825 patch link: https://lore.kernel.org/r/20230825190436.55045-8-mike.kravetz%40oracle.com patch subject: [PATCH 07/12] hugetlb: perform vmemmap restoration on a list of pages config: arm64-randconfig-r011-20230826 (https://download.01.org/0day-ci/archive/20230826/202308261407.9M957lhF-lkp@intel.com/config) compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a) reproduce: (https://download.01.org/0day-ci/archive/20230826/202308261407.9M957lhF-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202308261407.9M957lhF-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from mm/hugetlb.c:49: >> mm/hugetlb_vmemmap.h:50:2: error: void function 'hugetlb_vmemmap_restore_folios' should not return a value [-Wreturn-type] 50 | return 0; | ^ ~ 1 error generated. vim +/hugetlb_vmemmap_restore_folios +50 mm/hugetlb_vmemmap.h 47 48 static inline void hugetlb_vmemmap_restore_folios(const struct hstate *h, struct list_head *folio_list) 49 { > 50 return 0; 51 } 52
On 2023/8/26 03:04, Mike Kravetz wrote: > When removing hugetlb pages from the pool, we first create a list > of removed pages and then free those pages back to low level allocators. > Part of the 'freeing process' is to restore vmemmap for all base pages > if necessary. Pass this list of pages to a new routine > hugetlb_vmemmap_restore_folios() so that vmemmap restoration can be > performed in bulk. > > Signed-off-by: Mike Kravetz <mike.kravetz@oracle.com> > --- > mm/hugetlb.c | 3 +++ > mm/hugetlb_vmemmap.c | 8 ++++++++ > mm/hugetlb_vmemmap.h | 6 ++++++ > 3 files changed, 17 insertions(+) > > diff --git a/mm/hugetlb.c b/mm/hugetlb.c > index 3133dbd89696..1bde5e234d5c 100644 > --- a/mm/hugetlb.c > +++ b/mm/hugetlb.c > @@ -1833,6 +1833,9 @@ static void update_and_free_pages_bulk(struct hstate *h, struct list_head *list) > { > struct folio *folio, *t_folio; > > + /* First restore vmemmap for all pages on list. */ > + hugetlb_vmemmap_restore_folios(h, list); > + > list_for_each_entry_safe(folio, t_folio, list, lru) { > update_and_free_hugetlb_folio(h, folio, false); > cond_resched(); > diff --git a/mm/hugetlb_vmemmap.c b/mm/hugetlb_vmemmap.c > index 147018a504a6..d5e6b6c76dce 100644 > --- a/mm/hugetlb_vmemmap.c > +++ b/mm/hugetlb_vmemmap.c > @@ -479,6 +479,14 @@ int hugetlb_vmemmap_restore(const struct hstate *h, struct page *head) > return ret; > } > Because it is a void function, I'd like to add a comment here like: This function only tries to restore a list of folios' vmemmap pages and does not guarantee that the restoration will succeed after it returns. Thanks. > +void hugetlb_vmemmap_restore_folios(const struct hstate *h, struct list_head *folio_list) > +{ > + struct folio *folio; > + > + list_for_each_entry(folio, folio_list, lru) > + hugetlb_vmemmap_restore(h, &folio->page); > +} > + > /* Return true iff a HugeTLB whose vmemmap should and can be optimized. */ > static bool vmemmap_should_optimize(const struct hstate *h, const struct page *head) > { > diff --git a/mm/hugetlb_vmemmap.h b/mm/hugetlb_vmemmap.h > index 036494e040ca..b7074672ceb2 100644 > --- a/mm/hugetlb_vmemmap.h > +++ b/mm/hugetlb_vmemmap.h > @@ -12,6 +12,7 @@ > > #ifdef CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP > int hugetlb_vmemmap_restore(const struct hstate *h, struct page *head); > +void hugetlb_vmemmap_restore_folios(const struct hstate *h, struct list_head *folio_list); > void hugetlb_vmemmap_optimize(const struct hstate *h, struct page *head); > void hugetlb_vmemmap_optimize_folios(struct hstate *h, struct list_head *folio_list); > > @@ -44,6 +45,11 @@ static inline int hugetlb_vmemmap_restore(const struct hstate *h, struct page *h > return 0; > } > > +static inline void hugetlb_vmemmap_restore_folios(const struct hstate *h, struct list_head *folio_list) > +{ > + return 0; > +} > + > static inline void hugetlb_vmemmap_optimize(const struct hstate *h, struct page *head) > { > }
On 08/30/23 16:33, Muchun Song wrote: > > > On 2023/8/26 03:04, Mike Kravetz wrote: > > When removing hugetlb pages from the pool, we first create a list > > of removed pages and then free those pages back to low level allocators. > > Part of the 'freeing process' is to restore vmemmap for all base pages > > if necessary. Pass this list of pages to a new routine > > hugetlb_vmemmap_restore_folios() so that vmemmap restoration can be > > performed in bulk. > > > > Signed-off-by: Mike Kravetz <mike.kravetz@oracle.com> > > --- > > mm/hugetlb.c | 3 +++ > > mm/hugetlb_vmemmap.c | 8 ++++++++ > > mm/hugetlb_vmemmap.h | 6 ++++++ > > 3 files changed, 17 insertions(+) > > > > diff --git a/mm/hugetlb.c b/mm/hugetlb.c > > index 3133dbd89696..1bde5e234d5c 100644 > > --- a/mm/hugetlb.c > > +++ b/mm/hugetlb.c > > @@ -1833,6 +1833,9 @@ static void update_and_free_pages_bulk(struct hstate *h, struct list_head *list) > > { > > struct folio *folio, *t_folio; > > + /* First restore vmemmap for all pages on list. */ > > + hugetlb_vmemmap_restore_folios(h, list); > > + > > list_for_each_entry_safe(folio, t_folio, list, lru) { > > update_and_free_hugetlb_folio(h, folio, false); > > cond_resched(); > > diff --git a/mm/hugetlb_vmemmap.c b/mm/hugetlb_vmemmap.c > > index 147018a504a6..d5e6b6c76dce 100644 > > --- a/mm/hugetlb_vmemmap.c > > +++ b/mm/hugetlb_vmemmap.c > > @@ -479,6 +479,14 @@ int hugetlb_vmemmap_restore(const struct hstate *h, struct page *head) > > return ret; > > } > > Because it is a void function, I'd like to add a comment here like: > > This function only tries to restore a list of folios' vmemmap pages and > does not guarantee that the restoration will succeed after it returns. Will do. Thanks!
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 3133dbd89696..1bde5e234d5c 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -1833,6 +1833,9 @@ static void update_and_free_pages_bulk(struct hstate *h, struct list_head *list) { struct folio *folio, *t_folio; + /* First restore vmemmap for all pages on list. */ + hugetlb_vmemmap_restore_folios(h, list); + list_for_each_entry_safe(folio, t_folio, list, lru) { update_and_free_hugetlb_folio(h, folio, false); cond_resched(); diff --git a/mm/hugetlb_vmemmap.c b/mm/hugetlb_vmemmap.c index 147018a504a6..d5e6b6c76dce 100644 --- a/mm/hugetlb_vmemmap.c +++ b/mm/hugetlb_vmemmap.c @@ -479,6 +479,14 @@ int hugetlb_vmemmap_restore(const struct hstate *h, struct page *head) return ret; } +void hugetlb_vmemmap_restore_folios(const struct hstate *h, struct list_head *folio_list) +{ + struct folio *folio; + + list_for_each_entry(folio, folio_list, lru) + hugetlb_vmemmap_restore(h, &folio->page); +} + /* Return true iff a HugeTLB whose vmemmap should and can be optimized. */ static bool vmemmap_should_optimize(const struct hstate *h, const struct page *head) { diff --git a/mm/hugetlb_vmemmap.h b/mm/hugetlb_vmemmap.h index 036494e040ca..b7074672ceb2 100644 --- a/mm/hugetlb_vmemmap.h +++ b/mm/hugetlb_vmemmap.h @@ -12,6 +12,7 @@ #ifdef CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP int hugetlb_vmemmap_restore(const struct hstate *h, struct page *head); +void hugetlb_vmemmap_restore_folios(const struct hstate *h, struct list_head *folio_list); void hugetlb_vmemmap_optimize(const struct hstate *h, struct page *head); void hugetlb_vmemmap_optimize_folios(struct hstate *h, struct list_head *folio_list); @@ -44,6 +45,11 @@ static inline int hugetlb_vmemmap_restore(const struct hstate *h, struct page *h return 0; } +static inline void hugetlb_vmemmap_restore_folios(const struct hstate *h, struct list_head *folio_list) +{ + return 0; +} + static inline void hugetlb_vmemmap_optimize(const struct hstate *h, struct page *head) { }
When removing hugetlb pages from the pool, we first create a list of removed pages and then free those pages back to low level allocators. Part of the 'freeing process' is to restore vmemmap for all base pages if necessary. Pass this list of pages to a new routine hugetlb_vmemmap_restore_folios() so that vmemmap restoration can be performed in bulk. Signed-off-by: Mike Kravetz <mike.kravetz@oracle.com> --- mm/hugetlb.c | 3 +++ mm/hugetlb_vmemmap.c | 8 ++++++++ mm/hugetlb_vmemmap.h | 6 ++++++ 3 files changed, 17 insertions(+)