2022-08-29 23:07:19

by Sidhartha Kumar

[permalink] [raw]
Subject: [PATCH 1/7] mm/hugetlb: add folio support to hugetlb specific flag macros

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 <[email protected]>
---
include/linux/hugetlb.h | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)

diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index acace1a25226..ac4e98edd5b0 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -583,26 +583,47 @@ enum hugetlb_page_flags {
*/
#ifdef CONFIG_HUGETLB_PAGE
#define TESTHPAGEFLAG(uname, flname) \
+static __always_inline \
+int folio_test_hugetlb_##flname(struct folio *folio) \
+ { void **private = &folio->private; \
+ return test_bit(HPG_##flname, (void *)((unsigned long)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, (void *)((unsigned long)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, (void *)((unsigned long)private)); \
+ } \
static inline void ClearHPage##uname(struct page *page) \
{ clear_bit(HPG_##flname, &(page->private)); }
#else
#define TESTHPAGEFLAG(uname, flname) \
+static inline int 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


2022-08-30 03:43:34

by Matthew Wilcox

[permalink] [raw]
Subject: Re: [PATCH 1/7] mm/hugetlb: add folio support to hugetlb specific flag macros

On Mon, Aug 29, 2022 at 04:00:08PM -0700, Sidhartha Kumar wrote:
> #define TESTHPAGEFLAG(uname, flname) \
> +static __always_inline \
> +int folio_test_hugetlb_##flname(struct folio *folio) \

One change I made was to have folio_test_foo() return bool instead of
int. It helps the compiler really understand what's going on. Maybe
some humans too ;-)

> + { void **private = &folio->private; \
> + return test_bit(HPG_##flname, (void *)((unsigned long)private)); \

I've made this tricky for you by making folio->private a void * instead
of the unsigned long in page. Would this look better as ...

{ \
void *private = &folio->private; \
return test_bit(HPG_##flname, private); \

perhaps?

2022-08-30 18:32:15

by Sidhartha Kumar

[permalink] [raw]
Subject: Re: [PATCH 1/7] mm/hugetlb: add folio support to hugetlb specific flag macros



On 8/29/22 8:33 PM, Matthew Wilcox wrote:
> On Mon, Aug 29, 2022 at 04:00:08PM -0700, Sidhartha Kumar wrote:
>> #define TESTHPAGEFLAG(uname, flname) \
>> +static __always_inline \
>> +int folio_test_hugetlb_##flname(struct folio *folio) \
> One change I made was to have folio_test_foo() return bool instead of
> int. It helps the compiler really understand what's going on. Maybe
> some humans too ;-)
>

I went with returning an int to stay consistent with the page version
of the macros which return an int. I'm fine with changing it to return
a bool.

>> + { void **private = &folio->private; \
>> + return test_bit(HPG_##flname, (void *)((unsigned long)private)); \
> I've made this tricky for you by making folio->private a void * instead
> of the unsigned long in page. Would this look better as ...
>
> { \
> void *private = &folio->private; \
> return test_bit(HPG_##flname, private); \
>
> perhaps?

Ya this looks much better and passes the tests, will add to v2.



2022-09-01 17:44:55

by Mike Kravetz

[permalink] [raw]
Subject: Re: [PATCH 1/7] mm/hugetlb: add folio support to hugetlb specific flag macros

On 08/30/22 11:09, Sidhartha Kumar wrote:
>
>
> On 8/29/22 8:33 PM, Matthew Wilcox wrote:
> > On Mon, Aug 29, 2022 at 04:00:08PM -0700, Sidhartha Kumar wrote:
> > > #define TESTHPAGEFLAG(uname, flname) \
> > > +static __always_inline \
> > > +int folio_test_hugetlb_##flname(struct folio *folio) \
> > One change I made was to have folio_test_foo() return bool instead of
> > int. It helps the compiler really understand what's going on. Maybe
> > some humans too ;-)
> >
>
> I went with returning an int to stay consistent with the page version
> of the macros which return an int. I'm fine with changing it to return
> a bool.

I believe the page test macros returned an int when I added the hugetlb
specific versions. So, I just did the same. Since they are now bool,
it makes sense to have these be consistent.
--
Mike Kravetz

>
> > > + { void **private = &folio->private; \
> > > + return test_bit(HPG_##flname, (void *)((unsigned long)private)); \
> > I've made this tricky for you by making folio->private a void * instead
> > of the unsigned long in page. Would this look better as ...
> >
> > { \
> > void *private = &folio->private; \
> > return test_bit(HPG_##flname, private); \
> >
> > perhaps?
>
> Ya this looks much better and passes the tests, will add to v2.
>
>
>