[PATCH v4 01/34] mm: Add PAGE_TYPE_OP folio functions
Mike Rapoport
rppt at kernel.org
Wed Jun 14 06:02:07 PDT 2023
On Mon, Jun 12, 2023 at 02:03:50PM -0700, Vishal Moola (Oracle) wrote:
> No folio equivalents for page type operations have been defined, so
> define them for later folio conversions.
>
> Also changes the Page##uname macros to take in const struct page* since
> we only read the memory here.
>
> Signed-off-by: Vishal Moola (Oracle) <vishal.moola at gmail.com>
Acked-by: Mike Rapoport (IBM) <rppt at kernel.org>
> ---
> include/linux/page-flags.h | 20 ++++++++++++++++++--
> 1 file changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
> index 92a2063a0a23..e99a616b9bcd 100644
> --- a/include/linux/page-flags.h
> +++ b/include/linux/page-flags.h
> @@ -908,6 +908,8 @@ static inline bool is_page_hwpoison(struct page *page)
>
> #define PageType(page, flag) \
> ((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE)
> +#define folio_test_type(folio, flag) \
> + ((folio->page.page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE)
>
> static inline int page_type_has_type(unsigned int page_type)
> {
> @@ -920,20 +922,34 @@ static inline int page_has_type(struct page *page)
> }
>
> #define PAGE_TYPE_OPS(uname, lname) \
> -static __always_inline int Page##uname(struct page *page) \
> +static __always_inline int Page##uname(const struct page *page) \
> { \
> return PageType(page, PG_##lname); \
> } \
> +static __always_inline int folio_test_##lname(const struct folio *folio)\
> +{ \
> + return folio_test_type(folio, PG_##lname); \
> +} \
> static __always_inline void __SetPage##uname(struct page *page) \
> { \
> VM_BUG_ON_PAGE(!PageType(page, 0), page); \
> page->page_type &= ~PG_##lname; \
> } \
> +static __always_inline void __folio_set_##lname(struct folio *folio) \
> +{ \
> + VM_BUG_ON_FOLIO(!folio_test_type(folio, 0), folio); \
> + folio->page.page_type &= ~PG_##lname; \
> +} \
> static __always_inline void __ClearPage##uname(struct page *page) \
> { \
> VM_BUG_ON_PAGE(!Page##uname(page), page); \
> page->page_type |= PG_##lname; \
> -}
> +} \
> +static __always_inline void __folio_clear_##lname(struct folio *folio) \
> +{ \
> + VM_BUG_ON_FOLIO(!folio_test_##lname(folio), folio); \
> + folio->page.page_type |= PG_##lname; \
> +} \
>
> /*
> * PageBuddy() indicates that the page is free and in the buddy system
> --
> 2.40.1
>
>
--
Sincerely yours,
Mike.
More information about the linux-arm-kernel
mailing list