Skip to contentSkip to conversation

Some cleanups for shmem

PATCH Superseded Baolin Wang 2 participants 7 messages Jul 11, 2024 – Jul 12, 2024

Subsystems (3)

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore

Baolin Wang

author reviewer
#0 lore raw

cover Some cleanups for shmem

Hi,

This series does some cleanups to reuse code, rename functions and simplify logic to make code more clear. No functional changes are expected.

Baolin Wang (3):
mm: shmem: simplify the suitable huge orders validation for tmpfs
mm: shmem: rename shmem_is_huge() to shmem_huge_global_enabled()
mm: shmem: move shmem_huge_global_enabled() into
shmem_allowable_huge_orders()

 include/linux/shmem_fs.h | 11 +-----
 mm/huge_memory.c         | 11 ++----
 mm/shmem.c               | 84 ++++++++++++++++++++--------------------
 3 files changed, 46 insertions(+), 60 deletions(-)
Signature · 1 line
2.39.3
author reviewer
#1 lore raw

PATCH 1/3 mm: shmem: simplify the suitable huge orders validation for tmpfs

Move the suitable huge orders validation into shmem_suitable_orders() for tmpfs, which can reuse some code to simplify the logic.

In addition, we don't have special handling for the error code -E2BIG when checking for conflicts with PMD sized THP in the pagecache for tmpfs, instead, it will just fallback to order-0 allocations like this patch does, so this simplification will not add functional changes.

---
 mm/shmem.c | 39 +++++++++++++++------------------------
 1 file changed, 15 insertions(+), 24 deletions(-)
mm/shmem.c +15 -24
index f24dfbd387ba..db7e9808830f 100644
@@ -1685,19 +1685,29 @@ static unsigned long shmem_suitable_orders(struct inode *inode, struct vm_fault
 					   struct address_space *mapping, pgoff_t index,
 					   unsigned long orders)
 {
-	struct vm_area_struct *vma = vmf->vma;
+	struct vm_area_struct *vma = vmf ? vmf->vma : NULL;
 	unsigned long pages;
 	int order;
 
-	orders = thp_vma_suitable_orders(vma, vmf->address, orders);
-	if (!orders)
-		return 0;
+	if (vma) {
+		orders = thp_vma_suitable_orders(vma, vmf->address, orders);
+		if (!orders)
+			return 0;
+	}
 
 	/* Find the highest order that can add into the page cache */
 	order = highest_order(orders);
 	while (orders) {
 		pages = 1UL << order;
 		index = round_down(index, pages);
+		/*
+		 * Check for conflict before waiting on a huge allocation.
+		 * Conflict might be that a huge page has just been allocated
+		 * and added to page cache by a racing thread, or that there
+		 * is already at least one small page in the huge extent.
+		 * Be careful to retry when appropriate, but not forever!
+		 * Elsewhere -EEXIST would be the right code, but not here.
+		 */
 		if (!xa_find(&mapping->i_pages, &index,
 			     index + pages - 1, XA_PRESENT))
 			break;
@@ -1735,7 +1745,6 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf,
 {
 	struct address_space *mapping = inode->i_mapping;
 	struct shmem_inode_info *info = SHMEM_I(inode);
-	struct vm_area_struct *vma = vmf ? vmf->vma : NULL;
 	unsigned long suitable_orders = 0;
 	struct folio *folio = NULL;
 	long pages;
@@ -1745,26 +1754,8 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf,
 		orders = 0;
 
 	if (orders > 0) {
-		if (vma && vma_is_anon_shmem(vma)) {
-			suitable_orders = shmem_suitable_orders(inode, vmf,
+		suitable_orders = shmem_suitable_orders(inode, vmf,
 							mapping, index, orders);
-		} else if (orders & BIT(HPAGE_PMD_ORDER)) {
-			pages = HPAGE_PMD_NR;
-			suitable_orders = BIT(HPAGE_PMD_ORDER);
-			index = round_down(index, HPAGE_PMD_NR);
-
-			/*
-			 * Check for conflict before waiting on a huge allocation.
-			 * Conflict might be that a huge page has just been allocated
-			 * and added to page cache by a racing thread, or that there
-			 * is already at least one small page in the huge extent.
-			 * Be careful to retry when appropriate, but not forever!
-			 * Elsewhere -EEXIST would be the right code, but not here.
-			 */
-			if (xa_find(&mapping->i_pages, &index,
-				    index + HPAGE_PMD_NR - 1, XA_PRESENT))
-				return ERR_PTR(-E2BIG);
-		}
 
 		order = highest_order(suitable_orders);
 		while (suitable_orders) {
Signature · 1 line
2.39.3
author reviewer
#2 lore raw

PATCH 2/3 mm: shmem: rename shmem_is_huge() to shmem_huge_global_enabled()

In reply to Baolin Wang

The shmem_is_huge() is now used to check if the top-level huge page is enabled, thus rename it to reflect its usage.

---
 include/linux/shmem_fs.h |  9 +++++----
 mm/huge_memory.c         |  5 +++--
 mm/shmem.c               | 15 ++++++++-------
 3 files changed, 16 insertions(+), 13 deletions(-)
include/linux/shmem_fs.h +5 -4
index 1d06b1e5408a..405ee8d3589a 100644
@@ -111,14 +111,15 @@ extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end);
 int shmem_unuse(unsigned int type);
 
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
-extern bool shmem_is_huge(struct inode *inode, pgoff_t index, bool shmem_huge_force,
-			  struct mm_struct *mm, unsigned long vm_flags);
+extern bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index, bool shmem_huge_force,
+				      struct mm_struct *mm, unsigned long vm_flags);
 unsigned long shmem_allowable_huge_orders(struct inode *inode,
 				struct vm_area_struct *vma, pgoff_t index,
 				bool global_huge);
 #else
-static __always_inline bool shmem_is_huge(struct inode *inode, pgoff_t index, bool shmem_huge_force,
-					  struct mm_struct *mm, unsigned long vm_flags)
+static __always_inline bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
+						      bool shmem_huge_force, struct mm_struct *mm,
+						      unsigned long vm_flags)
 {
 	return false;
 }
mm/huge_memory.c +3 -2
index f9696c94e211..cc9bad12be75 100644
@@ -152,8 +152,9 @@ unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma,
 	 * own flags.
 	 */
 	if (!in_pf && shmem_file(vma->vm_file)) {
-		bool global_huge = shmem_is_huge(file_inode(vma->vm_file), vma->vm_pgoff,
-							!enforce_sysfs, vma->vm_mm, vm_flags);
+		bool global_huge = shmem_huge_global_enabled(file_inode(vma->vm_file),
+							     vma->vm_pgoff, !enforce_sysfs,
+							     vma->vm_mm, vm_flags);
 
 		if (!vma_is_anon_shmem(vma))
 			return global_huge ? orders : 0;
mm/shmem.c +8 -7
index db7e9808830f..1445dcd39b6f 100644
@@ -548,9 +548,9 @@ static bool shmem_confirm_swap(struct address_space *mapping,
 
 static int shmem_huge __read_mostly = SHMEM_HUGE_NEVER;
 
-static bool __shmem_is_huge(struct inode *inode, pgoff_t index,
-			    bool shmem_huge_force, struct mm_struct *mm,
-			    unsigned long vm_flags)
+static bool __shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
+					bool shmem_huge_force, struct mm_struct *mm,
+					unsigned long vm_flags)
 {
 	loff_t i_size;
 
@@ -581,14 +581,15 @@ static bool __shmem_is_huge(struct inode *inode, pgoff_t index,
 	}
 }
 
-bool shmem_is_huge(struct inode *inode, pgoff_t index,
+bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
 		   bool shmem_huge_force, struct mm_struct *mm,
 		   unsigned long vm_flags)
 {
 	if (HPAGE_PMD_ORDER > MAX_PAGECACHE_ORDER)
 		return false;
 
-	return __shmem_is_huge(inode, index, shmem_huge_force, mm, vm_flags);
+	return __shmem_huge_global_enabled(inode, index, shmem_huge_force,
+					   mm, vm_flags);
 }
 
 #if defined(CONFIG_SYSFS)
@@ -1156,7 +1157,7 @@ static int shmem_getattr(struct mnt_idmap *idmap,
 			STATX_ATTR_NODUMP);
 	generic_fillattr(idmap, request_mask, inode, stat);
 
-	if (shmem_is_huge(inode, 0, false, NULL, 0))
+	if (shmem_huge_global_enabled(inode, 0, false, NULL, 0))
 		stat->blksize = HPAGE_PMD_SIZE;
 
 	if (request_mask & STATX_BTIME) {
@@ -2153,7 +2154,7 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index,
 		return 0;
 	}
 
-	huge = shmem_is_huge(inode, index, false, fault_mm,
+	huge = shmem_huge_global_enabled(inode, index, false, fault_mm,
 			     vma ? vma->vm_flags : 0);
 	/* Find hugepage orders that are allowed for anonymous shmem. */
 	if (vma && vma_is_anon_shmem(vma))
Signature · 1 line
2.39.3
author reviewer
#3 lore raw

PATCH 3/3 mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders()

In reply to Baolin Wang

Move shmem_huge_global_enabled() into the shmem_allowable_huge_orders() function, so that shmem_allowable_huge_orders() can also help to find the allowable huge orders for tmpfs. Moreover the shmem_huge_global_enabled() can become static.

No functional changes.

---
 include/linux/shmem_fs.h | 12 ++----------
 mm/huge_memory.c         | 12 +++---------
 mm/shmem.c               | 34 ++++++++++++++++++++--------------
 3 files changed, 25 insertions(+), 33 deletions(-)
include/linux/shmem_fs.h +2 -10
index 405ee8d3589a..1564d7d3ca61 100644
@@ -111,21 +111,13 @@ extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end);
 int shmem_unuse(unsigned int type);
 
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
-extern bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index, bool shmem_huge_force,
-				      struct mm_struct *mm, unsigned long vm_flags);
 unsigned long shmem_allowable_huge_orders(struct inode *inode,
 				struct vm_area_struct *vma, pgoff_t index,
-				bool global_huge);
+				bool shmem_huge_force);
 #else
-static __always_inline bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
-						      bool shmem_huge_force, struct mm_struct *mm,
-						      unsigned long vm_flags)
-{
-	return false;
-}
 static inline unsigned long shmem_allowable_huge_orders(struct inode *inode,
 				struct vm_area_struct *vma, pgoff_t index,
-				bool global_huge)
+				bool shmem_huge_force)
 {
 	return 0;
 }
mm/huge_memory.c +3 -9
index cc9bad12be75..f69980b5b5fc 100644
@@ -151,16 +151,10 @@ unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma,
 	 * Must be done before hugepage flags check since shmem has its
 	 * own flags.
 	 */
-	if (!in_pf && shmem_file(vma->vm_file)) {
-		bool global_huge = shmem_huge_global_enabled(file_inode(vma->vm_file),
-							     vma->vm_pgoff, !enforce_sysfs,
-							     vma->vm_mm, vm_flags);
-
-		if (!vma_is_anon_shmem(vma))
-			return global_huge ? orders : 0;
+	if (!in_pf && shmem_file(vma->vm_file))
 		return shmem_allowable_huge_orders(file_inode(vma->vm_file),
-							vma, vma->vm_pgoff, global_huge);
-	}
+						   vma, vma->vm_pgoff,
+						   !enforce_sysfs);
 
 	if (!vma_is_anonymous(vma)) {
 		/*
mm/shmem.c +20 -14
index 1445dcd39b6f..e9610e2b2a43 100644
@@ -581,7 +581,7 @@ static bool __shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
 	}
 }
 
-bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
+static bool shmem_huge_global_enabled(struct inode *inode, pgoff_t index,
 		   bool shmem_huge_force, struct mm_struct *mm,
 		   unsigned long vm_flags)
 {
@@ -1625,27 +1625,39 @@ static gfp_t limit_gfp_mask(gfp_t huge_gfp, gfp_t limit_gfp)
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 unsigned long shmem_allowable_huge_orders(struct inode *inode,
 				struct vm_area_struct *vma, pgoff_t index,
-				bool global_huge)
+				bool shmem_huge_force)
 {
 	unsigned long mask = READ_ONCE(huge_shmem_orders_always);
 	unsigned long within_size_orders = READ_ONCE(huge_shmem_orders_within_size);
-	unsigned long vm_flags = vma->vm_flags;
+	unsigned long vm_flags = vma ? vma->vm_flags : 0;
+	struct mm_struct *fault_mm = vma ? vma->vm_mm : NULL;
 	/*
 	 * Check all the (large) orders below HPAGE_PMD_ORDER + 1 that
 	 * are enabled for this vma.
 	 */
 	unsigned long orders = BIT(PMD_ORDER + 1) - 1;
+	bool global_huge;
 	loff_t i_size;
 	int order;
 
-	if ((vm_flags & VM_NOHUGEPAGE) ||
-	    test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags))
+	if (vma && ((vm_flags & VM_NOHUGEPAGE) ||
+	    test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags)))
 		return 0;
 
 	/* If the hardware/firmware marked hugepage support disabled. */
 	if (transparent_hugepage_flags & (1 << TRANSPARENT_HUGEPAGE_UNSUPPORTED))
 		return 0;
 
+	global_huge = shmem_huge_global_enabled(inode, index, shmem_huge_force,
+						fault_mm, vm_flags);
+	if (!vma || !vma_is_anon_shmem(vma)) {
+		/*
+		 * For tmpfs, we now only support PMD sized THP if huge page
+		 * is enabled, otherwise fallback to order 0.
+		 */
+		return global_huge ? BIT(HPAGE_PMD_ORDER) : 0;
+	}
+
 	/*
 	 * Following the 'deny' semantics of the top level, force the huge
 	 * option off from all mounts.
@@ -2081,7 +2093,7 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index,
 	struct mm_struct *fault_mm;
 	struct folio *folio;
 	int error;
-	bool alloced, huge;
+	bool alloced;
 	unsigned long orders = 0;
 
 	if (WARN_ON_ONCE(!shmem_mapping(inode->i_mapping)))
@@ -2154,14 +2166,8 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index,
 		return 0;
 	}
 
-	huge = shmem_huge_global_enabled(inode, index, false, fault_mm,
-			     vma ? vma->vm_flags : 0);
-	/* Find hugepage orders that are allowed for anonymous shmem. */
-	if (vma && vma_is_anon_shmem(vma))
-		orders = shmem_allowable_huge_orders(inode, vma, index, huge);
-	else if (huge)
-		orders = BIT(HPAGE_PMD_ORDER);
-
+	/* Find hugepage orders that are allowed for anonymous shmem and tmpfs. */
+	orders = shmem_allowable_huge_orders(inode, vma, index, false);
 	if (orders > 0) {
 		gfp_t huge_gfp;
 
Signature · 1 line
2.39.3
#4 lore raw

Re: [PATCH 3/3] mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders()

kernel test robot noticed the following build errors:

Hi Baolin,

kernel test robot noticed the following build errors:

[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on next-20240711]
[cannot apply to linus/master v6.10-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/Baolin-Wang/mm-shmem-simplify-the-suitable-huge-orders-validation-for-tmpfs/20240711-134512
base:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link:    https://lore.kernel.org/r/6e5858d345304d0428c1c2c2a25c289c062b4ea8.1720668581.git.baolin.wang%40linux.alibaba.com
patch subject: [PATCH 3/3] mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders()
config: x86_64-allnoconfig (https://download.01.org/0day-ci/archive/20240712/[email protected]/config)
compiler: clang version 18.1.5 (https://github.com/llvm/llvm-project 617a15a9eac96088ae5e9134248d8236e34b91b1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240712/[email protected]/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 <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All errors (new ones prefixed by >>):

>> mm/shmem.c:1160:6: error: call to undeclared function 'shmem_huge_global_enabled'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
    1160 |         if (shmem_huge_global_enabled(inode, 0, false, NULL, 0))
         |             ^

1 error generated.

vim +/shmem_huge_global_enabled +1160 mm/shmem.c

^1da177e4c3f41 Linus Torvalds    2005-04-16  1138  
b74d24f7a74ffd Christian Brauner 2023-01-13  1139  static int shmem_getattr(struct mnt_idmap *idmap,
549c7297717c32 Christian Brauner 2021-01-21  1140  			 const struct path *path, struct kstat *stat,
a528d35e8bfcc5 David Howells     2017-01-31  1141  			 u32 request_mask, unsigned int query_flags)
44a30220bc0a17 Yu Zhao           2015-09-08  1142  {
a528d35e8bfcc5 David Howells     2017-01-31  1143  	struct inode *inode = path->dentry->d_inode;
44a30220bc0a17 Yu Zhao           2015-09-08  1144  	struct shmem_inode_info *info = SHMEM_I(inode);
44a30220bc0a17 Yu Zhao           2015-09-08  1145  
3c1b7528d8969a Hugh Dickins      2023-08-03  1146  	if (info->alloced - info->swapped != inode->i_mapping->nrpages)
3c1b7528d8969a Hugh Dickins      2023-08-03  1147  		shmem_recalc_inode(inode, 0, 0);
3c1b7528d8969a Hugh Dickins      2023-08-03  1148  
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1149  	if (info->fsflags & FS_APPEND_FL)
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1150  		stat->attributes |= STATX_ATTR_APPEND;
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1151  	if (info->fsflags & FS_IMMUTABLE_FL)
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1152  		stat->attributes |= STATX_ATTR_IMMUTABLE;
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1153  	if (info->fsflags & FS_NODUMP_FL)
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1154  		stat->attributes |= STATX_ATTR_NODUMP;
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1155  	stat->attributes_mask |= (STATX_ATTR_APPEND |
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1156  			STATX_ATTR_IMMUTABLE |
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1157  			STATX_ATTR_NODUMP);
0d72b92883c651 Jeff Layton       2023-08-07  1158  	generic_fillattr(idmap, request_mask, inode, stat);
89fdcd262fd407 Yang Shi          2018-06-07  1159  
dca7b12ffe751b Baolin Wang       2024-07-11 @1160  	if (shmem_huge_global_enabled(inode, 0, false, NULL, 0))
89fdcd262fd407 Yang Shi          2018-06-07  1161  		stat->blksize = HPAGE_PMD_SIZE;
89fdcd262fd407 Yang Shi          2018-06-07  1162  
f7cd16a55837f3 Xavier Roche      2022-03-22  1163  	if (request_mask & STATX_BTIME) {
f7cd16a55837f3 Xavier Roche      2022-03-22  1164  		stat->result_mask |= STATX_BTIME;
f7cd16a55837f3 Xavier Roche      2022-03-22  1165  		stat->btime.tv_sec = info->i_crtime.tv_sec;
f7cd16a55837f3 Xavier Roche      2022-03-22  1166  		stat->btime.tv_nsec = info->i_crtime.tv_nsec;
f7cd16a55837f3 Xavier Roche      2022-03-22  1167  	}
f7cd16a55837f3 Xavier Roche      2022-03-22  1168  
44a30220bc0a17 Yu Zhao           2015-09-08  1169  	return 0;
44a30220bc0a17 Yu Zhao           2015-09-08  1170  }
44a30220bc0a17 Yu Zhao           2015-09-08  1171  
Signature · 2 lines
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
author reviewer
#5 lore raw

Re: [PATCH 3/3] mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders()

Quoted 24 lines · kernel test robot

Hi Baolin,

kernel test robot noticed the following build errors:

[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on next-20240711]
[cannot apply to linus/master v6.10-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/Baolin-Wang/mm-shmem-simplify-the-suitable-huge-orders-validation-for-tmpfs/20240711-134512
base:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link:    https://lore.kernel.org/r/6e5858d345304d0428c1c2c2a25c289c062b4ea8.1720668581.git.baolin.wang%40linux.alibaba.com
patch subject: [PATCH 3/3] mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders()
config: x86_64-allnoconfig (https://download.01.org/0day-ci/archive/20240712/[email protected]/config)
compiler: clang version 18.1.5 (https://github.com/llvm/llvm-project 617a15a9eac96088ae5e9134248d8236e34b91b1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240712/[email protected]/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 <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

Quoted 6 lines

All errors (new ones prefixed by >>):

Quoted 1 line
Quoted 1 line

mm/shmem.c:1160:6: error: call to undeclared function 'shmem_huge_global_enabled'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]

1160 | if (shmem_huge_global_enabled(inode, 0, false, NULL, 0))
| ^
1 error generated.

Thanks for reporting. I forgot to add a dummy function in case CONFIG_TRANSPARENT_HUGEPAGE is not enabled. Will fix in next version.

#6 lore raw

Re: [PATCH 3/3] mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders()

In reply to Baolin Wang
kernel test robot noticed the following build errors:

Hi Baolin,

kernel test robot noticed the following build errors:

[auto build test ERROR on akpm-mm/mm-everything]
[also build test ERROR on next-20240711]
[cannot apply to linus/master v6.10-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/Baolin-Wang/mm-shmem-simplify-the-suitable-huge-orders-validation-for-tmpfs/20240711-134512
base:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link:    https://lore.kernel.org/r/6e5858d345304d0428c1c2c2a25c289c062b4ea8.1720668581.git.baolin.wang%40linux.alibaba.com
patch subject: [PATCH 3/3] mm: shmem: move shmem_huge_global_enabled() into shmem_allowable_huge_orders()
config: x86_64-defconfig (https://download.01.org/0day-ci/archive/20240712/[email protected]/config)
compiler: gcc-13 (Ubuntu 13.2.0-4ubuntu3) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240712/[email protected]/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 <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All errors (new ones prefixed by >>):

mm/shmem.c: In function 'shmem_getattr':

>> mm/shmem.c:1160:13: error: implicit declaration of function 'shmem_huge_global_enabled' [-Werror=implicit-function-declaration]
    1160 |         if (shmem_huge_global_enabled(inode, 0, false, NULL, 0))
         |             ^~~~~~~~~~~~~~~~~~~~~~~~~

cc1: some warnings being treated as errors

vim +/shmem_huge_global_enabled +1160 mm/shmem.c

^1da177e4c3f41 Linus Torvalds    2005-04-16  1138  
b74d24f7a74ffd Christian Brauner 2023-01-13  1139  static int shmem_getattr(struct mnt_idmap *idmap,
549c7297717c32 Christian Brauner 2021-01-21  1140  			 const struct path *path, struct kstat *stat,
a528d35e8bfcc5 David Howells     2017-01-31  1141  			 u32 request_mask, unsigned int query_flags)
44a30220bc0a17 Yu Zhao           2015-09-08  1142  {
a528d35e8bfcc5 David Howells     2017-01-31  1143  	struct inode *inode = path->dentry->d_inode;
44a30220bc0a17 Yu Zhao           2015-09-08  1144  	struct shmem_inode_info *info = SHMEM_I(inode);
44a30220bc0a17 Yu Zhao           2015-09-08  1145  
3c1b7528d8969a Hugh Dickins      2023-08-03  1146  	if (info->alloced - info->swapped != inode->i_mapping->nrpages)
3c1b7528d8969a Hugh Dickins      2023-08-03  1147  		shmem_recalc_inode(inode, 0, 0);
3c1b7528d8969a Hugh Dickins      2023-08-03  1148  
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1149  	if (info->fsflags & FS_APPEND_FL)
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1150  		stat->attributes |= STATX_ATTR_APPEND;
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1151  	if (info->fsflags & FS_IMMUTABLE_FL)
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1152  		stat->attributes |= STATX_ATTR_IMMUTABLE;
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1153  	if (info->fsflags & FS_NODUMP_FL)
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1154  		stat->attributes |= STATX_ATTR_NODUMP;
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1155  	stat->attributes_mask |= (STATX_ATTR_APPEND |
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1156  			STATX_ATTR_IMMUTABLE |
e408e695f5f1f6 Theodore Ts'o     2022-07-14  1157  			STATX_ATTR_NODUMP);
0d72b92883c651 Jeff Layton       2023-08-07  1158  	generic_fillattr(idmap, request_mask, inode, stat);
89fdcd262fd407 Yang Shi          2018-06-07  1159  
dca7b12ffe751b Baolin Wang       2024-07-11 @1160  	if (shmem_huge_global_enabled(inode, 0, false, NULL, 0))
89fdcd262fd407 Yang Shi          2018-06-07  1161  		stat->blksize = HPAGE_PMD_SIZE;
89fdcd262fd407 Yang Shi          2018-06-07  1162  
f7cd16a55837f3 Xavier Roche      2022-03-22  1163  	if (request_mask & STATX_BTIME) {
f7cd16a55837f3 Xavier Roche      2022-03-22  1164  		stat->result_mask |= STATX_BTIME;
f7cd16a55837f3 Xavier Roche      2022-03-22  1165  		stat->btime.tv_sec = info->i_crtime.tv_sec;
f7cd16a55837f3 Xavier Roche      2022-03-22  1166  		stat->btime.tv_nsec = info->i_crtime.tv_nsec;
f7cd16a55837f3 Xavier Roche      2022-03-22  1167  	}
f7cd16a55837f3 Xavier Roche      2022-03-22  1168  
44a30220bc0a17 Yu Zhao           2015-09-08  1169  	return 0;
44a30220bc0a17 Yu Zhao           2015-09-08  1170  }
44a30220bc0a17 Yu Zhao           2015-09-08  1171  
Signature · 2 lines
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki