* [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
* 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
* [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
* 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
* [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
* 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
* [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
* 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
* [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
* 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
* [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 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