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);
+       }

Reply via email to