* [PATCH v4 1/5] mm/hugetlb: add folio support to hugetlb specific flag macros
2022-09-22 15:42 [PATCH v4 0/5] begin converting hugetlb code to folios Sidhartha Kumar
@ 2022-09-22 15:42 ` Sidhartha Kumar
2022-09-23 3:01 ` Muchun Song
2022-09-22 15:42 ` [PATCH v4 2/5] mm: add private field of first tail to struct page and struct folio Sidhartha Kumar
` (3 subsequent siblings)
4 siblings, 1 reply; 8+ messages in thread
From: Sidhartha Kumar @ 2022-09-22 15:42 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>
Reviewed-by: Mike Kravetz <mike.kravetz@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 cfe15b32e2d4..8edcdb6a833f 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -623,26 +623,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] 8+ messages in thread
* Re: [PATCH v4 1/5] mm/hugetlb: add folio support to hugetlb specific flag macros
2022-09-22 15:42 ` [PATCH v4 1/5] mm/hugetlb: add folio support to hugetlb specific flag macros Sidhartha Kumar
@ 2022-09-23 3:01 ` Muchun Song
0 siblings, 0 replies; 8+ messages in thread
From: Muchun Song @ 2022-09-23 3:01 UTC (permalink / raw)
To: Sidhartha Kumar
Cc: linux-kernel, Linux MM, Andrew Morton, Muchun Song, Mike Kravetz,
Matthew Wilcox, Vlastimil Babka, William Kucharski, dhowells,
Peter Xu, arnd, ccross, hughd, ebiederm
> On Sep 22, 2022, at 23:42, Sidhartha Kumar <sidhartha.kumar@oracle.com> 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>
> Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
Reviewed-by: Muchun Song <songmuchun@bytedance.com>
Thanks.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v4 2/5] mm: add private field of first tail to struct page and struct folio
2022-09-22 15:42 [PATCH v4 0/5] begin converting hugetlb code to folios Sidhartha Kumar
2022-09-22 15:42 ` [PATCH v4 1/5] mm/hugetlb: add folio support to hugetlb specific flag macros Sidhartha Kumar
@ 2022-09-22 15:42 ` Sidhartha Kumar
2022-09-22 15:42 ` [PATCH v4 3/5] mm/hugetlb: add hugetlb_folio_subpool() helpers Sidhartha Kumar
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Sidhartha Kumar @ 2022-09-22 15:42 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>
Acked-by: Mike Kravetz <mike.kravetz@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 500e536796ca..2d5b1575ffe0 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -144,6 +144,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 */
@@ -264,6 +265,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
@@ -311,6 +313,7 @@ struct folio {
#ifdef CONFIG_64BIT
unsigned int _folio_nr_pages;
#endif
+ unsigned long _private_1;
};
#define FOLIO_MATCH(pg, fl) \
@@ -338,6 +341,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
@@ -383,6 +387,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] 8+ messages in thread
* [PATCH v4 3/5] mm/hugetlb: add hugetlb_folio_subpool() helpers
2022-09-22 15:42 [PATCH v4 0/5] begin converting hugetlb code to folios Sidhartha Kumar
2022-09-22 15:42 ` [PATCH v4 1/5] mm/hugetlb: add folio support to hugetlb specific flag macros Sidhartha Kumar
2022-09-22 15:42 ` [PATCH v4 2/5] mm: add private field of first tail to struct page and struct folio Sidhartha Kumar
@ 2022-09-22 15:42 ` Sidhartha Kumar
2022-09-22 15:42 ` [PATCH v4 4/5] hugetlbfs: convert hugetlb_delete_from_page_cache() to use folios Sidhartha Kumar
2022-09-22 15:42 ` [PATCH v4 5/5] mm/hugetlb: add folio_hstate() Sidhartha Kumar
4 siblings, 0 replies; 8+ messages in thread
From: Sidhartha Kumar @ 2022-09-22 15:42 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 and read subpool information by
passing in a folio.
Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
---
fs/hugetlbfs/inode.c | 8 ++++----
include/linux/hugetlb.h | 15 +++++++++++++--
2 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index ed57a029eab0..5a4b136c6c36 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -1099,10 +1099,10 @@ static int hugetlbfs_migrate_folio(struct address_space *mapping,
if (rc != MIGRATEPAGE_SUCCESS)
return rc;
- if (hugetlb_page_subpool(&src->page)) {
- hugetlb_set_page_subpool(&dst->page,
- hugetlb_page_subpool(&src->page));
- hugetlb_set_page_subpool(&src->page, NULL);
+ if (hugetlb_folio_subpool(src)) {
+ hugetlb_set_folio_subpool(dst,
+ hugetlb_folio_subpool(src));
+ 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 8edcdb6a833f..f92b9e6c8f9e 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -752,18 +752,29 @@ 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_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] 8+ messages in thread
* [PATCH v4 4/5] hugetlbfs: convert hugetlb_delete_from_page_cache() to use folios
2022-09-22 15:42 [PATCH v4 0/5] begin converting hugetlb code to folios Sidhartha Kumar
` (2 preceding siblings ...)
2022-09-22 15:42 ` [PATCH v4 3/5] mm/hugetlb: add hugetlb_folio_subpool() helpers Sidhartha Kumar
@ 2022-09-22 15:42 ` Sidhartha Kumar
2022-09-23 23:02 ` Mike Kravetz
2022-09-22 15:42 ` [PATCH v4 5/5] mm/hugetlb: add folio_hstate() Sidhartha Kumar
4 siblings, 1 reply; 8+ messages in thread
From: Sidhartha Kumar @ 2022-09-22 15:42 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 +++++++-------
include/linux/pagemap.h | 1 -
mm/folio-compat.c | 5 -----
3 files changed, 7 insertions(+), 13 deletions(-)
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 5a4b136c6c36..4201bad56542 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);
}
/*
@@ -574,8 +574,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,
@@ -1122,7 +1122,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);
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index 0178b2040ea3..4611156ccfe9 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -1106,7 +1106,6 @@ int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
int filemap_add_folio(struct address_space *mapping, struct folio *folio,
pgoff_t index, gfp_t gfp);
void filemap_remove_folio(struct folio *folio);
-void delete_from_page_cache(struct page *page);
void __filemap_remove_folio(struct folio *folio, void *shadow);
void replace_page_cache_page(struct page *old, struct page *new);
void delete_from_page_cache_batch(struct address_space *mapping,
diff --git a/mm/folio-compat.c b/mm/folio-compat.c
index 458618c7302c..e04a61905d4d 100644
--- a/mm/folio-compat.c
+++ b/mm/folio-compat.c
@@ -118,11 +118,6 @@ struct page *grab_cache_page_write_begin(struct address_space *mapping,
}
EXPORT_SYMBOL(grab_cache_page_write_begin);
-void delete_from_page_cache(struct page *page)
-{
- return filemap_remove_folio(page_folio(page));
-}
-
int try_to_release_page(struct page *page, gfp_t gfp)
{
return filemap_release_folio(page_folio(page), gfp);
--
2.31.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v4 4/5] hugetlbfs: convert hugetlb_delete_from_page_cache() to use folios
2022-09-22 15:42 ` [PATCH v4 4/5] hugetlbfs: convert hugetlb_delete_from_page_cache() to use folios Sidhartha Kumar
@ 2022-09-23 23:02 ` Mike Kravetz
0 siblings, 0 replies; 8+ messages in thread
From: Mike Kravetz @ 2022-09-23 23:02 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/22/22 10:42, Sidhartha Kumar wrote:
> 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 +++++++-------
> include/linux/pagemap.h | 1 -
> mm/folio-compat.c | 5 -----
> 3 files changed, 7 insertions(+), 13 deletions(-)
Thanks!
Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
--
Mike Kravetz
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v4 5/5] mm/hugetlb: add folio_hstate()
2022-09-22 15:42 [PATCH v4 0/5] begin converting hugetlb code to folios Sidhartha Kumar
` (3 preceding siblings ...)
2022-09-22 15:42 ` [PATCH v4 4/5] hugetlbfs: convert hugetlb_delete_from_page_cache() to use folios Sidhartha Kumar
@ 2022-09-22 15:42 ` Sidhartha Kumar
4 siblings, 0 replies; 8+ messages in thread
From: Sidhartha Kumar @ 2022-09-22 15:42 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>
Reviewed-by: Mike Kravetz <mike.kravetz@oracle.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 f92b9e6c8f9e..b4473bc43806 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -858,10 +858,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)
@@ -1070,6 +1075,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 c228afba0963..17b92af421b9 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1607,7 +1607,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] 8+ messages in thread