Re: [PATCH v2 10/13] mm/munlock: mlock_page() munlock_page() batch by pagevec

From: Matthew Wilcox
Date: Tue Feb 15 2022 - 11:41:09 EST


On Mon, Feb 14, 2022 at 06:37:29PM -0800, Hugh Dickins wrote:
> +/*
> + * Flags held in the low bits of a struct page pointer on the mlock_pvec.
> + */
> +#define LRU_PAGE 0x1
> +#define NEW_PAGE 0x2
> +#define mlock_lru(page) ((struct page *)((unsigned long)page + LRU_PAGE))
> +#define mlock_new(page) ((struct page *)((unsigned long)page + NEW_PAGE))

You've tripped over one of the weirdnesses in the C preprocessor here.
If the variable passed is not _named_ page, it gets cast to a pointer
to a struct of the same name as the variable. There's no way to tell
cpp that that 'page' after 'struct' is literal and not to be replaced
by the 'page' argument.

I'm going to change this to:

static inline struct page *mlock_lru(struct page *page)
{
return (struct page *)((unsigned long)page + LRU_PAGE);
}

(mutatis mutandi for mlock_new)