Re: [PATCH v6 20/37] mm: fix non-compound multi-order memory accounting in __free_pages

From: Matthew Wilcox
Date: Thu Mar 21 2024 - 12:57:33 EST


On Thu, Mar 21, 2024 at 09:36:42AM -0700, Suren Baghdasaryan wrote:
> static inline void pgalloc_tag_add(struct page *page, struct task_struct *task,
> unsigned int nr) {}
> static inline void pgalloc_tag_sub(struct page *page, unsigned int nr) {}
> static inline void pgalloc_tag_split(struct page *page, unsigned int nr) {}
> +static inline struct alloc_tag *pgalloc_tag_get(struct page *page) { return NULL; }
> +static inline void pgalloc_tag_sub_pages(struct alloc_tag *tag, unsigned int nr) {}
>
> #endif /* CONFIG_MEM_ALLOC_PROFILING */
>
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index fd1cc5b80a56..00e0ae4cbf2d 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -4700,12 +4700,15 @@ void __free_pages(struct page *page, unsigned int order)
> {
> /* get PageHead before we drop reference */
> int head = PageHead(page);
> + struct alloc_tag *tag = pgalloc_tag_get(page);
>
> if (put_page_testzero(page))
> free_the_page(page, order);
> - else if (!head)
> + else if (!head) {
> + pgalloc_tag_sub_pages(tag, (1 << order) - 1);
> while (order-- > 0)
> free_the_page(page + (1 << order), order);
> + }

Why do you need these new functions instead of just:

+ else if (!head) {
+ pgalloc_tag_sub(page, (1 << order) - 1);
while (order-- > 0)
free_the_page(page + (1 << order), order);
+ }