All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/6] begin converting hugetlb code to folios
@ 2022-09-08 19:37 Sidhartha Kumar
  2022-09-08 19:37 ` [PATCH v3 1/6] mm/hugetlb: add folio support to hugetlb specific flag macros Sidhartha Kumar
                   ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: Sidhartha Kumar @ 2022-09-08 19:37 UTC (permalink / raw)
  To: linux-kernel, linux-mm
  Cc: akpm, songmuchun, mike.kravetz, willy, vbabka, william.kucharski,
	dhowells, peterx, arnd, ccross, hughd, ebiederm, Sidhartha Kumar

This patch series starts the conversion of the hugetlb code to operate
on struct folios rather than struct pages. This removes the ambiguitiy
of whether functions are operating on head pages, tail pages of compound
pages, or base pages. 

This series passes the linux test project hugetlb test cases.

Patch 1 adds hugeltb specific page macros that can operate on folios.

Patch 2 adds the private field of the first tail page to struct page.
For 32-bit, _private_1 alinging with page[1].private was confirmed by
using pahole. This patch depends on Matthew Wilcox's patch mm: Add the first tail
page to struct folio[1]:

Patchs 3-4 introduce hugetlb subpool helper functions which operate on
struct folios. These patches were tested using the hugepage-mmap.c
selftest along with the migratepages command.

Patch 5 converts hugetlb_delete_from_page_cache() to use folios. This
patch depends on Mike Kravetz's patch: hugetlb: rename remove_huge_page
to hugetlb_delete_from_page_cache[2].

Patch 6 adds a folio_hstate() function to get hstate information from a
folio and adds a user of folio_hstate().

Bpftrace was used to track time spent in the free_huge_pages function
during the ltp test cases as it is a caller of the hugetlb subpool
functions. From the histogram, the performance is similar before and
after the patch series. 

Time spent in 'free_huge_page'

6.0.0-rc2.master.20220823
@nsecs:
[256, 512)         14770 |@@@@@@@@@@@@@@@@@@@@@@@@@@@
			 |@@@@@@@@@@@@@@@@@@@@@@@@@			      |
[512, 1K)            155 |                                                    |
[1K, 2K)             169 |                                                    |
[2K, 4K)              50 |                                                    |
[4K, 8K)              14 |                                                    |
[8K, 16K)              3 |                                                    |
[16K, 32K)             3 |                                                    |


6.0.0-rc2.master.20220823 + patch series
@nsecs:
[256, 512)         13678 |@@@@@@@@@@@@@@@@@@@@@@@@@@@			      |
			 |@@@@@@@@@@@@@@@@@@@@@@@@@			      |
[512, 1K)            142 |                                                    |
[1K, 2K)             199 |                                                    |
[2K, 4K)              44 |                                                    |
[4K, 8K)              13 |                                                    |
[8K, 16K)              4 |                                                    |
[16K, 32K)             1 |                                                    |

[1] https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next/+/f0a284d27efbfcc1a46c2a6075a259e628ad29c0
[2] https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next/+/e829be3202116d9aeb94cc1ff64e89dcbf7c47d3

v2 -> v3:
- fix build error by defining folio_hsate() when CONFIG_HUGETLB_PAGE=n
v1 --> v2:
- test compiling on i386.
- change return type from int to bool in patch 1
- move _private_1 field in struct page to within a CONFIG_64BIT block in patch 2
- squash patch 7 from v1 into patch 6

Sidhartha Kumar (6):
  mm/hugetlb: add folio support to hugetlb specific flag macros
  mm: add private field of first tail to struct page and struct folio
  mm/hugetlb: add hugetlb_folio_subpool() helper
  mm/hugetlb: add hugetlb_set_folio_subpool() helper
  hugetlbfs: convert hugetlb_delete_from_page_cache() to use folios
  mm/hugetlb: add folio_hstate()

 fs/hugetlbfs/inode.c     | 22 ++++++++---------
 include/linux/hugetlb.h  | 53 +++++++++++++++++++++++++++++++++++++---
 include/linux/mm_types.h | 14 +++++++++++
 mm/migrate.c             |  2 +-
 4 files changed, 75 insertions(+), 16 deletions(-)

-- 
2.31.1


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v3 1/6] mm/hugetlb: add folio support to hugetlb specific flag macros
  2022-09-08 19:37 [PATCH v3 0/6] begin converting hugetlb code to folios Sidhartha Kumar
@ 2022-09-08 19:37 ` Sidhartha Kumar
  2022-09-19 22:09   ` Mike Kravetz
  2022-09-08 19:37 ` [PATCH v3 2/6] mm: add private field of first tail to struct page and struct folio Sidhartha Kumar
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Sidhartha Kumar @ 2022-09-08 19:37 UTC (permalink / raw)
  To: linux-kernel, linux-mm
  Cc: akpm, songmuchun, mike.kravetz, willy, vbabka, william.kucharski,
	dhowells, peterx, arnd, ccross, hughd, ebiederm, Sidhartha Kumar

Allows the macros which test, set, and clear hugetlb specific page
flags to take a hugetlb folio as an input. The marcros are generated as
folio_{test, set, clear}_hugetlb_{restore_reserve, migratable,
temporary, freed, vmemmap_optimized, raw_hwp_unreliable}.

Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
---
 include/linux/hugetlb.h | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 852f911d676e..0952ea50251d 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -615,26 +615,50 @@ enum hugetlb_page_flags {
  */
 #ifdef CONFIG_HUGETLB_PAGE
 #define TESTHPAGEFLAG(uname, flname)				\
+static __always_inline						\
+bool folio_test_hugetlb_##flname(struct folio *folio)		\
+	{	void *private = &folio->private;		\
+		return test_bit(HPG_##flname, private);		\
+	}							\
 static inline int HPage##uname(struct page *page)		\
 	{ return test_bit(HPG_##flname, &(page->private)); }
 
 #define SETHPAGEFLAG(uname, flname)				\
+static __always_inline						\
+void folio_set_hugetlb_##flname(struct folio *folio)		\
+	{	void *private = &folio->private;		\
+		set_bit(HPG_##flname, private);			\
+	}							\
 static inline void SetHPage##uname(struct page *page)		\
 	{ set_bit(HPG_##flname, &(page->private)); }
 
 #define CLEARHPAGEFLAG(uname, flname)				\
+static __always_inline						\
+void folio_clear_hugetlb_##flname(struct folio *folio)		\
+	{	void *private = &folio->private;		\
+		clear_bit(HPG_##flname, private);		\
+	}							\
 static inline void ClearHPage##uname(struct page *page)		\
 	{ clear_bit(HPG_##flname, &(page->private)); }
 #else
 #define TESTHPAGEFLAG(uname, flname)				\
+static inline bool						\
+folio_test_hugetlb_##flname(struct folio *folio)		\
+	{ return 0; }						\
 static inline int HPage##uname(struct page *page)		\
 	{ return 0; }
 
 #define SETHPAGEFLAG(uname, flname)				\
+static inline void						\
+folio_set_hugetlb_##flname(struct folio *folio) 		\
+	{ }							\
 static inline void SetHPage##uname(struct page *page)		\
 	{ }
 
 #define CLEARHPAGEFLAG(uname, flname)				\
+static inline void						\
+folio_clear_hugetlb_##flname(struct folio *folio)		\
+	{ }							\
 static inline void ClearHPage##uname(struct page *page)		\
 	{ }
 #endif
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 2/6] mm: add private field of first tail to struct page and struct folio
  2022-09-08 19:37 [PATCH v3 0/6] begin converting hugetlb code to folios Sidhartha Kumar
  2022-09-08 19:37 ` [PATCH v3 1/6] mm/hugetlb: add folio support to hugetlb specific flag macros Sidhartha Kumar
@ 2022-09-08 19:37 ` Sidhartha Kumar
  2022-09-19 22:14   ` Mike Kravetz
  2022-09-08 19:37 ` [PATCH v3 3/6] mm/hugetlb: add hugetlb_folio_subpool() helper Sidhartha Kumar
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Sidhartha Kumar @ 2022-09-08 19:37 UTC (permalink / raw)
  To: linux-kernel, linux-mm
  Cc: akpm, songmuchun, mike.kravetz, willy, vbabka, william.kucharski,
	dhowells, peterx, arnd, ccross, hughd, ebiederm, Sidhartha Kumar

Allows struct folio to store hugetlb metadata that is contained in the
private field of the first tail page. On 32-bit, _private_1 aligns with
page[1].private.

Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
---
 include/linux/mm_types.h | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index 8a9ee9d24973..7a33171a05b6 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -143,6 +143,7 @@ struct page {
 			atomic_t compound_pincount;
 #ifdef CONFIG_64BIT
 			unsigned int compound_nr; /* 1 << compound_order */
+			unsigned long _private_1;
 #endif
 		};
 		struct {	/* Second tail page of compound page */
@@ -251,6 +252,7 @@ struct page {
  * @_total_mapcount: Do not use directly, call folio_entire_mapcount().
  * @_pincount: Do not use directly, call folio_maybe_dma_pinned().
  * @_folio_nr_pages: Do not use directly, call folio_nr_pages().
+ * @_private_1: Do not use directly, call folio_get_private_1().
  *
  * A folio is a physically, virtually and logically contiguous set
  * of bytes.  It is a power-of-two in size, and it is aligned to that
@@ -298,6 +300,7 @@ struct folio {
 #ifdef CONFIG_64BIT
 	unsigned int _folio_nr_pages;
 #endif
+	unsigned long _private_1;
 };
 
 #define FOLIO_MATCH(pg, fl)						\
@@ -325,6 +328,7 @@ FOLIO_MATCH(compound_mapcount, _total_mapcount);
 FOLIO_MATCH(compound_pincount, _pincount);
 #ifdef CONFIG_64BIT
 FOLIO_MATCH(compound_nr, _folio_nr_pages);
+FOLIO_MATCH(_private_1, _private_1);
 #endif
 #undef FOLIO_MATCH
 
@@ -370,6 +374,16 @@ static inline void *folio_get_private(struct folio *folio)
 	return folio->private;
 }
 
+static inline void folio_set_private_1(struct folio *folio, unsigned long private)
+{
+	folio->_private_1 = private;
+}
+
+static inline unsigned long folio_get_private_1(struct folio *folio)
+{
+	return folio->_private_1;
+}
+
 struct page_frag_cache {
 	void * va;
 #if (PAGE_SIZE < PAGE_FRAG_CACHE_MAX_SIZE)
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 3/6] mm/hugetlb: add hugetlb_folio_subpool() helper
  2022-09-08 19:37 [PATCH v3 0/6] begin converting hugetlb code to folios Sidhartha Kumar
  2022-09-08 19:37 ` [PATCH v3 1/6] mm/hugetlb: add folio support to hugetlb specific flag macros Sidhartha Kumar
  2022-09-08 19:37 ` [PATCH v3 2/6] mm: add private field of first tail to struct page and struct folio Sidhartha Kumar
@ 2022-09-08 19:37 ` Sidhartha Kumar
  2022-09-19 22:24   ` Mike Kravetz
  2022-09-08 19:37 ` [PATCH v3 4/6] mm/hugetlb: add hugetlb_set_folio_subpool() helper Sidhartha Kumar
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Sidhartha Kumar @ 2022-09-08 19:37 UTC (permalink / raw)
  To: linux-kernel, linux-mm
  Cc: akpm, songmuchun, mike.kravetz, willy, vbabka, william.kucharski,
	dhowells, peterx, arnd, ccross, hughd, ebiederm, Sidhartha Kumar

Allows hugetlbfs_migrate_folio to check subpool information by passing
in a folio.

Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
(cherry picked from commit cd9e187858b45b890097cfcd0b2eb4bbbb9a59ae)
Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
---
 fs/hugetlbfs/inode.c    | 4 ++--
 include/linux/hugetlb.h | 7 ++++++-
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 52d9b390389b..c2e9c0cdbd81 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -1151,9 +1151,9 @@ static int hugetlbfs_migrate_folio(struct address_space *mapping,
 	if (rc != MIGRATEPAGE_SUCCESS)
 		return rc;
 
-	if (hugetlb_page_subpool(&src->page)) {
+	if (hugetlb_folio_subpool(src)) {
 		hugetlb_set_page_subpool(&dst->page,
-					hugetlb_page_subpool(&src->page));
+					hugetlb_folio_subpool(src));
 		hugetlb_set_page_subpool(&src->page, NULL);
 	}
 
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 0952ea50251d..1e7c4007386e 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -744,12 +744,17 @@ extern unsigned int default_hstate_idx;
 
 #define default_hstate (hstates[default_hstate_idx])
 
+static inline struct hugepage_subpool *hugetlb_folio_subpool(struct folio *folio)
+{
+	return (void *)folio_get_private_1(folio);
+}
+
 /*
  * hugetlb page subpool pointer located in hpage[1].private
  */
 static inline struct hugepage_subpool *hugetlb_page_subpool(struct page *hpage)
 {
-	return (void *)page_private(hpage + SUBPAGE_INDEX_SUBPOOL);
+	return hugetlb_folio_subpool(page_folio(hpage));
 }
 
 static inline void hugetlb_set_page_subpool(struct page *hpage,
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 4/6] mm/hugetlb: add hugetlb_set_folio_subpool() helper
  2022-09-08 19:37 [PATCH v3 0/6] begin converting hugetlb code to folios Sidhartha Kumar
                   ` (2 preceding siblings ...)
  2022-09-08 19:37 ` [PATCH v3 3/6] mm/hugetlb: add hugetlb_folio_subpool() helper Sidhartha Kumar
@ 2022-09-08 19:37 ` Sidhartha Kumar
  2022-09-19 22:26   ` Mike Kravetz
  2022-09-08 19:37 ` [PATCH v3 5/6] hugetlbfs: convert hugetlb_delete_from_page_cache() to use folios Sidhartha Kumar
  2022-09-08 19:37 ` [PATCH v3 6/6] mm/hugetlb: add folio_hstate() Sidhartha Kumar
  5 siblings, 1 reply; 13+ messages in thread
From: Sidhartha Kumar @ 2022-09-08 19:37 UTC (permalink / raw)
  To: linux-kernel, linux-mm
  Cc: akpm, songmuchun, mike.kravetz, willy, vbabka, william.kucharski,
	dhowells, peterx, arnd, ccross, hughd, ebiederm, Sidhartha Kumar

Allows hugetlb subpool information to be set through a folio.

Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
---
 fs/hugetlbfs/inode.c    | 4 ++--
 include/linux/hugetlb.h | 8 +++++++-
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index c2e9c0cdbd81..d9e08c445e2f 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -1152,9 +1152,9 @@ static int hugetlbfs_migrate_folio(struct address_space *mapping,
 		return rc;
 
 	if (hugetlb_folio_subpool(src)) {
-		hugetlb_set_page_subpool(&dst->page,
+		hugetlb_set_folio_subpool(dst,
 					hugetlb_folio_subpool(src));
-		hugetlb_set_page_subpool(&src->page, NULL);
+		hugetlb_set_folio_subpool(src, NULL);
 	}
 
 	if (mode != MIGRATE_SYNC_NO_COPY)
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 1e7c4007386e..0bcaca694ab7 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -757,10 +757,16 @@ static inline struct hugepage_subpool *hugetlb_page_subpool(struct page *hpage)
 	return hugetlb_folio_subpool(page_folio(hpage));
 }
 
+static inline void hugetlb_set_folio_subpool(struct folio *folio,
+					struct hugepage_subpool *subpool)
+{
+	folio_set_private_1(folio, (unsigned long)subpool);
+}
+
 static inline void hugetlb_set_page_subpool(struct page *hpage,
 					struct hugepage_subpool *subpool)
 {
-	set_page_private(hpage + SUBPAGE_INDEX_SUBPOOL, (unsigned long)subpool);
+	hugetlb_set_folio_subpool(page_folio(hpage), subpool);
 }
 
 static inline struct hstate *hstate_file(struct file *f)
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 5/6] hugetlbfs: convert hugetlb_delete_from_page_cache() to use folios
  2022-09-08 19:37 [PATCH v3 0/6] begin converting hugetlb code to folios Sidhartha Kumar
                   ` (3 preceding siblings ...)
  2022-09-08 19:37 ` [PATCH v3 4/6] mm/hugetlb: add hugetlb_set_folio_subpool() helper Sidhartha Kumar
@ 2022-09-08 19:37 ` Sidhartha Kumar
  2022-09-19 22:33   ` Mike Kravetz
  2022-09-08 19:37 ` [PATCH v3 6/6] mm/hugetlb: add folio_hstate() Sidhartha Kumar
  5 siblings, 1 reply; 13+ messages in thread
From: Sidhartha Kumar @ 2022-09-08 19:37 UTC (permalink / raw)
  To: linux-kernel, linux-mm
  Cc: akpm, songmuchun, mike.kravetz, willy, vbabka, william.kucharski,
	dhowells, peterx, arnd, ccross, hughd, ebiederm, Sidhartha Kumar

Removes the last caller of delete_from_page_cache() by converting the
code to its folio equivalent.

Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
---
 fs/hugetlbfs/inode.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index d9e08c445e2f..38920702765e 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -364,11 +364,11 @@ static int hugetlbfs_write_end(struct file *file, struct address_space *mapping,
 	return -EINVAL;
 }
 
-static void hugetlb_delete_from_page_cache(struct page *page)
+static void hugetlb_delete_from_page_cache(struct folio *folio)
 {
-	ClearPageDirty(page);
-	ClearPageUptodate(page);
-	delete_from_page_cache(page);
+	folio_clear_dirty(folio);
+	folio_clear_uptodate(folio);
+	filemap_remove_folio(folio);
 }
 
 /*
@@ -562,8 +562,8 @@ static bool remove_inode_single_folio(struct hstate *h, struct inode *inode,
 		 * map could fail.  Correspondingly, the subpool and global
 		 * reserve usage count can need to be adjusted.
 		 */
-		VM_BUG_ON(HPageRestoreReserve(&folio->page));
-		hugetlb_delete_from_page_cache(&folio->page);
+		VM_BUG_ON_FOLIO(folio_test_hugetlb_restore_reserve(folio), folio);
+		hugetlb_delete_from_page_cache(folio);
 		ret = true;
 		if (!truncate_op) {
 			if (unlikely(hugetlb_unreserve_pages(inode, index,
@@ -1174,7 +1174,7 @@ static int hugetlbfs_error_remove_page(struct address_space *mapping,
 	struct inode *inode = mapping->host;
 	pgoff_t index = page->index;
 
-	hugetlb_delete_from_page_cache(page);
+	hugetlb_delete_from_page_cache(page_folio(page));
 	if (unlikely(hugetlb_unreserve_pages(inode, index, index + 1, 1)))
 		hugetlb_fix_reserve_counts(inode);
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 6/6] mm/hugetlb: add folio_hstate()
  2022-09-08 19:37 [PATCH v3 0/6] begin converting hugetlb code to folios Sidhartha Kumar
                   ` (4 preceding siblings ...)
  2022-09-08 19:37 ` [PATCH v3 5/6] hugetlbfs: convert hugetlb_delete_from_page_cache() to use folios Sidhartha Kumar
@ 2022-09-08 19:37 ` Sidhartha Kumar
  2022-09-19 22:43   ` Mike Kravetz
  5 siblings, 1 reply; 13+ messages in thread
From: Sidhartha Kumar @ 2022-09-08 19:37 UTC (permalink / raw)
  To: linux-kernel, linux-mm
  Cc: akpm, songmuchun, mike.kravetz, willy, vbabka, william.kucharski,
	dhowells, peterx, arnd, ccross, hughd, ebiederm, Sidhartha Kumar,
	kernel test robot

Helper function to retrieve hstate information from a hugetlb folio.

Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
Reported-by: kernel test robot <lkp@intel.com>
---
 include/linux/hugetlb.h | 14 ++++++++++++--
 mm/migrate.c            |  2 +-
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 0bcaca694ab7..f59e8fb3f937 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -850,10 +850,15 @@ static inline pte_t arch_make_huge_pte(pte_t entry, unsigned int shift,
 }
 #endif
 
+static inline struct hstate *folio_hstate(struct folio *folio)
+{
+	VM_BUG_ON_FOLIO(!folio_test_hugetlb(folio), folio);
+	return size_to_hstate(folio_size(folio));
+}
+
 static inline struct hstate *page_hstate(struct page *page)
 {
-	VM_BUG_ON_PAGE(!PageHuge(page), page);
-	return size_to_hstate(page_size(page));
+	return folio_hstate(page_folio(page));
 }
 
 static inline unsigned hstate_index_to_shift(unsigned index)
@@ -1057,6 +1062,11 @@ static inline struct hstate *hstate_vma(struct vm_area_struct *vma)
 	return NULL;
 }
 
+static inline struct hstate *folio_hstate(struct folio *folio)
+{
+	return NULL;
+}
+
 static inline struct hstate *page_hstate(struct page *page)
 {
 	return NULL;
diff --git a/mm/migrate.c b/mm/migrate.c
index 6a1597c92261..55392a706493 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1589,7 +1589,7 @@ struct page *alloc_migration_target(struct page *page, unsigned long private)
 		nid = folio_nid(folio);
 
 	if (folio_test_hugetlb(folio)) {
-		struct hstate *h = page_hstate(&folio->page);
+		struct hstate *h = folio_hstate(folio);
 
 		gfp_mask = htlb_modify_alloc_mask(h, gfp_mask);
 		return alloc_huge_page_nodemask(h, nid, mtc->nmask, gfp_mask);
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 1/6] mm/hugetlb: add folio support to hugetlb specific flag macros
  2022-09-08 19:37 ` [PATCH v3 1/6] mm/hugetlb: add folio support to hugetlb specific flag macros Sidhartha Kumar
@ 2022-09-19 22:09   ` Mike Kravetz
  0 siblings, 0 replies; 13+ messages in thread
From: Mike Kravetz @ 2022-09-19 22:09 UTC (permalink / raw)
  To: Sidhartha Kumar
  Cc: linux-kernel, linux-mm, akpm, songmuchun, willy, vbabka,
	william.kucharski, dhowells, peterx, arnd, ccross, hughd,
	ebiederm

On 09/08/22 12:37, Sidhartha Kumar wrote:
> Allows the macros which test, set, and clear hugetlb specific page
> flags to take a hugetlb folio as an input. The marcros are generated as
> folio_{test, set, clear}_hugetlb_{restore_reserve, migratable,
> temporary, freed, vmemmap_optimized, raw_hwp_unreliable}.
> 
> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> ---
>  include/linux/hugetlb.h | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)

I wish there was more usage of these new macros.  The only usage is a
folio_test_hugetlb_restore_reserve() call in patch 5.  Usage will expand
as more code is converted.

Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
-- 
Mike Kravetz

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 2/6] mm: add private field of first tail to struct page and struct folio
  2022-09-08 19:37 ` [PATCH v3 2/6] mm: add private field of first tail to struct page and struct folio Sidhartha Kumar
@ 2022-09-19 22:14   ` Mike Kravetz
  0 siblings, 0 replies; 13+ messages in thread
From: Mike Kravetz @ 2022-09-19 22:14 UTC (permalink / raw)
  To: Sidhartha Kumar
  Cc: linux-kernel, linux-mm, akpm, songmuchun, willy, vbabka,
	william.kucharski, dhowells, peterx, arnd, ccross, hughd,
	ebiederm

On 09/08/22 12:37, Sidhartha Kumar wrote:
> Allows struct folio to store hugetlb metadata that is contained in the
> private field of the first tail page. On 32-bit, _private_1 aligns with
> page[1].private.
> 
> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> ---
>  include/linux/mm_types.h | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)

This change is fine with me as it makes the following patches dealing
with hugetlb page subpool folio aware.  I 'think' Matthew is OK with
this direction, but it would be good if he chimed in.

Acked-by: Mike Kravetz <mike.kravetz@oracle.com>
-- 
Mike Kravetz

> 
> diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> index 8a9ee9d24973..7a33171a05b6 100644
> --- a/include/linux/mm_types.h
> +++ b/include/linux/mm_types.h
> @@ -143,6 +143,7 @@ struct page {
>  			atomic_t compound_pincount;
>  #ifdef CONFIG_64BIT
>  			unsigned int compound_nr; /* 1 << compound_order */
> +			unsigned long _private_1;
>  #endif
>  		};
>  		struct {	/* Second tail page of compound page */
> @@ -251,6 +252,7 @@ struct page {
>   * @_total_mapcount: Do not use directly, call folio_entire_mapcount().
>   * @_pincount: Do not use directly, call folio_maybe_dma_pinned().
>   * @_folio_nr_pages: Do not use directly, call folio_nr_pages().
> + * @_private_1: Do not use directly, call folio_get_private_1().
>   *
>   * A folio is a physically, virtually and logically contiguous set
>   * of bytes.  It is a power-of-two in size, and it is aligned to that
> @@ -298,6 +300,7 @@ struct folio {
>  #ifdef CONFIG_64BIT
>  	unsigned int _folio_nr_pages;
>  #endif
> +	unsigned long _private_1;
>  };
>  
>  #define FOLIO_MATCH(pg, fl)						\
> @@ -325,6 +328,7 @@ FOLIO_MATCH(compound_mapcount, _total_mapcount);
>  FOLIO_MATCH(compound_pincount, _pincount);
>  #ifdef CONFIG_64BIT
>  FOLIO_MATCH(compound_nr, _folio_nr_pages);
> +FOLIO_MATCH(_private_1, _private_1);
>  #endif
>  #undef FOLIO_MATCH
>  
> @@ -370,6 +374,16 @@ static inline void *folio_get_private(struct folio *folio)
>  	return folio->private;
>  }
>  
> +static inline void folio_set_private_1(struct folio *folio, unsigned long private)
> +{
> +	folio->_private_1 = private;
> +}
> +
> +static inline unsigned long folio_get_private_1(struct folio *folio)
> +{
> +	return folio->_private_1;
> +}
> +
>  struct page_frag_cache {
>  	void * va;
>  #if (PAGE_SIZE < PAGE_FRAG_CACHE_MAX_SIZE)
> -- 
> 2.31.1
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 3/6] mm/hugetlb: add hugetlb_folio_subpool() helper
  2022-09-08 19:37 ` [PATCH v3 3/6] mm/hugetlb: add hugetlb_folio_subpool() helper Sidhartha Kumar
@ 2022-09-19 22:24   ` Mike Kravetz
  0 siblings, 0 replies; 13+ messages in thread
From: Mike Kravetz @ 2022-09-19 22:24 UTC (permalink / raw)
  To: Sidhartha Kumar
  Cc: linux-kernel, linux-mm, akpm, songmuchun, willy, vbabka,
	william.kucharski, dhowells, peterx, arnd, ccross, hughd,
	ebiederm

On 09/08/22 12:37, Sidhartha Kumar wrote:
> Allows hugetlbfs_migrate_folio to check subpool information by passing
> in a folio.
> 
> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> (cherry picked from commit cd9e187858b45b890097cfcd0b2eb4bbbb9a59ae)

??? I think this must have been included by mistake.

> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> ---
>  fs/hugetlbfs/inode.c    | 4 ++--
>  include/linux/hugetlb.h | 7 ++++++-
>  2 files changed, 8 insertions(+), 3 deletions(-)

I think this and the following patch are simple enough to combine.  They
both are dealing with accessing/setting hugetlb subpool info.  They already
have the same 'Subject:'. :)

With these fixups,
Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
-- 
Mike Kravetz

> 
> diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
> index 52d9b390389b..c2e9c0cdbd81 100644
> --- a/fs/hugetlbfs/inode.c
> +++ b/fs/hugetlbfs/inode.c
> @@ -1151,9 +1151,9 @@ static int hugetlbfs_migrate_folio(struct address_space *mapping,
>  	if (rc != MIGRATEPAGE_SUCCESS)
>  		return rc;
>  
> -	if (hugetlb_page_subpool(&src->page)) {
> +	if (hugetlb_folio_subpool(src)) {
>  		hugetlb_set_page_subpool(&dst->page,
> -					hugetlb_page_subpool(&src->page));
> +					hugetlb_folio_subpool(src));
>  		hugetlb_set_page_subpool(&src->page, NULL);
>  	}
>  
> diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
> index 0952ea50251d..1e7c4007386e 100644
> --- a/include/linux/hugetlb.h
> +++ b/include/linux/hugetlb.h
> @@ -744,12 +744,17 @@ extern unsigned int default_hstate_idx;
>  
>  #define default_hstate (hstates[default_hstate_idx])
>  
> +static inline struct hugepage_subpool *hugetlb_folio_subpool(struct folio *folio)
> +{
> +	return (void *)folio_get_private_1(folio);
> +}
> +
>  /*
>   * hugetlb page subpool pointer located in hpage[1].private
>   */
>  static inline struct hugepage_subpool *hugetlb_page_subpool(struct page *hpage)
>  {
> -	return (void *)page_private(hpage + SUBPAGE_INDEX_SUBPOOL);
> +	return hugetlb_folio_subpool(page_folio(hpage));
>  }
>  
>  static inline void hugetlb_set_page_subpool(struct page *hpage,
> -- 
> 2.31.1
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 4/6] mm/hugetlb: add hugetlb_set_folio_subpool() helper
  2022-09-08 19:37 ` [PATCH v3 4/6] mm/hugetlb: add hugetlb_set_folio_subpool() helper Sidhartha Kumar
@ 2022-09-19 22:26   ` Mike Kravetz
  0 siblings, 0 replies; 13+ messages in thread
From: Mike Kravetz @ 2022-09-19 22:26 UTC (permalink / raw)
  To: Sidhartha Kumar
  Cc: linux-kernel, linux-mm, akpm, songmuchun, willy, vbabka,
	william.kucharski, dhowells, peterx, arnd, ccross, hughd,
	ebiederm

On 09/08/22 12:37, Sidhartha Kumar wrote:
> Allows hugetlb subpool information to be set through a folio.
> 
> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> ---
>  fs/hugetlbfs/inode.c    | 4 ++--
>  include/linux/hugetlb.h | 8 +++++++-
>  2 files changed, 9 insertions(+), 3 deletions(-)

As previously mentioned, I would suggest just combining this with the
previous patch.  Changes look fine.
-- 
Mike Kravetz

> 
> diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
> index c2e9c0cdbd81..d9e08c445e2f 100644
> --- a/fs/hugetlbfs/inode.c
> +++ b/fs/hugetlbfs/inode.c
> @@ -1152,9 +1152,9 @@ static int hugetlbfs_migrate_folio(struct address_space *mapping,
>  		return rc;
>  
>  	if (hugetlb_folio_subpool(src)) {
> -		hugetlb_set_page_subpool(&dst->page,
> +		hugetlb_set_folio_subpool(dst,
>  					hugetlb_folio_subpool(src));
> -		hugetlb_set_page_subpool(&src->page, NULL);
> +		hugetlb_set_folio_subpool(src, NULL);
>  	}
>  
>  	if (mode != MIGRATE_SYNC_NO_COPY)
> diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
> index 1e7c4007386e..0bcaca694ab7 100644
> --- a/include/linux/hugetlb.h
> +++ b/include/linux/hugetlb.h
> @@ -757,10 +757,16 @@ static inline struct hugepage_subpool *hugetlb_page_subpool(struct page *hpage)
>  	return hugetlb_folio_subpool(page_folio(hpage));
>  }
>  
> +static inline void hugetlb_set_folio_subpool(struct folio *folio,
> +					struct hugepage_subpool *subpool)
> +{
> +	folio_set_private_1(folio, (unsigned long)subpool);
> +}
> +
>  static inline void hugetlb_set_page_subpool(struct page *hpage,
>  					struct hugepage_subpool *subpool)
>  {
> -	set_page_private(hpage + SUBPAGE_INDEX_SUBPOOL, (unsigned long)subpool);
> +	hugetlb_set_folio_subpool(page_folio(hpage), subpool);
>  }
>  
>  static inline struct hstate *hstate_file(struct file *f)
> -- 
> 2.31.1
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 5/6] hugetlbfs: convert hugetlb_delete_from_page_cache() to use folios
  2022-09-08 19:37 ` [PATCH v3 5/6] hugetlbfs: convert hugetlb_delete_from_page_cache() to use folios Sidhartha Kumar
@ 2022-09-19 22:33   ` Mike Kravetz
  0 siblings, 0 replies; 13+ messages in thread
From: Mike Kravetz @ 2022-09-19 22:33 UTC (permalink / raw)
  To: Sidhartha Kumar
  Cc: linux-kernel, linux-mm, akpm, songmuchun, willy, vbabka,
	william.kucharski, dhowells, peterx, arnd, ccross, hughd,
	ebiederm

On 09/08/22 12:37, Sidhartha Kumar wrote:
> Removes the last caller of delete_from_page_cache() by converting the
> code to its folio equivalent.

Changes below look fine.

However, if this patch removes the last caller of delete_from_page_cache()
then I think it should also remove delete_from_page_cache?
-- 
Mike Kravetz

> 
> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> ---
>  fs/hugetlbfs/inode.c | 14 +++++++-------
>  1 file changed, 7 insertions(+), 7 deletions(-)
> 
> diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
> index d9e08c445e2f..38920702765e 100644
> --- a/fs/hugetlbfs/inode.c
> +++ b/fs/hugetlbfs/inode.c
> @@ -364,11 +364,11 @@ static int hugetlbfs_write_end(struct file *file, struct address_space *mapping,
>  	return -EINVAL;
>  }
>  
> -static void hugetlb_delete_from_page_cache(struct page *page)
> +static void hugetlb_delete_from_page_cache(struct folio *folio)
>  {
> -	ClearPageDirty(page);
> -	ClearPageUptodate(page);
> -	delete_from_page_cache(page);
> +	folio_clear_dirty(folio);
> +	folio_clear_uptodate(folio);
> +	filemap_remove_folio(folio);
>  }
>  
>  /*
> @@ -562,8 +562,8 @@ static bool remove_inode_single_folio(struct hstate *h, struct inode *inode,
>  		 * map could fail.  Correspondingly, the subpool and global
>  		 * reserve usage count can need to be adjusted.
>  		 */
> -		VM_BUG_ON(HPageRestoreReserve(&folio->page));
> -		hugetlb_delete_from_page_cache(&folio->page);
> +		VM_BUG_ON_FOLIO(folio_test_hugetlb_restore_reserve(folio), folio);
> +		hugetlb_delete_from_page_cache(folio);
>  		ret = true;
>  		if (!truncate_op) {
>  			if (unlikely(hugetlb_unreserve_pages(inode, index,
> @@ -1174,7 +1174,7 @@ static int hugetlbfs_error_remove_page(struct address_space *mapping,
>  	struct inode *inode = mapping->host;
>  	pgoff_t index = page->index;
>  
> -	hugetlb_delete_from_page_cache(page);
> +	hugetlb_delete_from_page_cache(page_folio(page));
>  	if (unlikely(hugetlb_unreserve_pages(inode, index, index + 1, 1)))
>  		hugetlb_fix_reserve_counts(inode);
>  
> -- 
> 2.31.1
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 6/6] mm/hugetlb: add folio_hstate()
  2022-09-08 19:37 ` [PATCH v3 6/6] mm/hugetlb: add folio_hstate() Sidhartha Kumar
@ 2022-09-19 22:43   ` Mike Kravetz
  0 siblings, 0 replies; 13+ messages in thread
From: Mike Kravetz @ 2022-09-19 22:43 UTC (permalink / raw)
  To: Sidhartha Kumar
  Cc: linux-kernel, linux-mm, akpm, songmuchun, willy, vbabka,
	william.kucharski, dhowells, peterx, arnd, ccross, hughd,
	ebiederm, kernel test robot

On 09/08/22 12:37, Sidhartha Kumar wrote:
> Helper function to retrieve hstate information from a hugetlb folio.
> 
> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> Reported-by: kernel test robot <lkp@intel.com>
> ---
>  include/linux/hugetlb.h | 14 ++++++++++++--
>  mm/migrate.c            |  2 +-
>  2 files changed, 13 insertions(+), 3 deletions(-)

Thanks,  Someday we will be able to remove page_hstate.

Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
-- 
Mike Kravetz

> 
> diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
> index 0bcaca694ab7..f59e8fb3f937 100644
> --- a/include/linux/hugetlb.h
> +++ b/include/linux/hugetlb.h
> @@ -850,10 +850,15 @@ static inline pte_t arch_make_huge_pte(pte_t entry, unsigned int shift,
>  }
>  #endif
>  
> +static inline struct hstate *folio_hstate(struct folio *folio)
> +{
> +	VM_BUG_ON_FOLIO(!folio_test_hugetlb(folio), folio);
> +	return size_to_hstate(folio_size(folio));
> +}
> +
>  static inline struct hstate *page_hstate(struct page *page)
>  {
> -	VM_BUG_ON_PAGE(!PageHuge(page), page);
> -	return size_to_hstate(page_size(page));
> +	return folio_hstate(page_folio(page));
>  }
>  
>  static inline unsigned hstate_index_to_shift(unsigned index)
> @@ -1057,6 +1062,11 @@ static inline struct hstate *hstate_vma(struct vm_area_struct *vma)
>  	return NULL;
>  }
>  
> +static inline struct hstate *folio_hstate(struct folio *folio)
> +{
> +	return NULL;
> +}
> +
>  static inline struct hstate *page_hstate(struct page *page)
>  {
>  	return NULL;
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 6a1597c92261..55392a706493 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -1589,7 +1589,7 @@ struct page *alloc_migration_target(struct page *page, unsigned long private)
>  		nid = folio_nid(folio);
>  
>  	if (folio_test_hugetlb(folio)) {
> -		struct hstate *h = page_hstate(&folio->page);
> +		struct hstate *h = folio_hstate(folio);
>  
>  		gfp_mask = htlb_modify_alloc_mask(h, gfp_mask);
>  		return alloc_huge_page_nodemask(h, nid, mtc->nmask, gfp_mask);
> -- 
> 2.31.1

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2022-09-19 22:43 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-08 19:37 [PATCH v3 0/6] begin converting hugetlb code to folios Sidhartha Kumar
2022-09-08 19:37 ` [PATCH v3 1/6] mm/hugetlb: add folio support to hugetlb specific flag macros Sidhartha Kumar
2022-09-19 22:09   ` Mike Kravetz
2022-09-08 19:37 ` [PATCH v3 2/6] mm: add private field of first tail to struct page and struct folio Sidhartha Kumar
2022-09-19 22:14   ` Mike Kravetz
2022-09-08 19:37 ` [PATCH v3 3/6] mm/hugetlb: add hugetlb_folio_subpool() helper Sidhartha Kumar
2022-09-19 22:24   ` Mike Kravetz
2022-09-08 19:37 ` [PATCH v3 4/6] mm/hugetlb: add hugetlb_set_folio_subpool() helper Sidhartha Kumar
2022-09-19 22:26   ` Mike Kravetz
2022-09-08 19:37 ` [PATCH v3 5/6] hugetlbfs: convert hugetlb_delete_from_page_cache() to use folios Sidhartha Kumar
2022-09-19 22:33   ` Mike Kravetz
2022-09-08 19:37 ` [PATCH v3 6/6] mm/hugetlb: add folio_hstate() Sidhartha Kumar
2022-09-19 22:43   ` Mike Kravetz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.