In several cases we are freeing pages which were not allocated using common page allocators. For such cases, in order to keep allocation accounting correct, we should clear the page tag to indicate that the page being freed is expected to not have a valid allocation tag. Introduce clear_page_tag_ref() helper function to be used for this.
Suggested-by: David Hildenbrand david@redhat.com Signed-off-by: Suren Baghdasaryan surenb@google.com Cc: stable@vger.kernel.org # v6.10 --- include/linux/pgalloc_tag.h | 13 +++++++++++++ mm/mm_init.c | 10 +--------- mm/page_alloc.c | 9 +-------- 3 files changed, 15 insertions(+), 17 deletions(-)
diff --git a/include/linux/pgalloc_tag.h b/include/linux/pgalloc_tag.h index 18cd0c0c73d9..207f0c83c8e9 100644 --- a/include/linux/pgalloc_tag.h +++ b/include/linux/pgalloc_tag.h @@ -43,6 +43,18 @@ static inline void put_page_tag_ref(union codetag_ref *ref) page_ext_put(page_ext_from_codetag_ref(ref)); }
+static inline void clear_page_tag_ref(struct page *page) +{ + if (mem_alloc_profiling_enabled()) { + union codetag_ref *ref = get_page_tag_ref(page); + + if (ref) { + set_codetag_empty(ref); + put_page_tag_ref(ref); + } + } +} + static inline void pgalloc_tag_add(struct page *page, struct task_struct *task, unsigned int nr) { @@ -126,6 +138,7 @@ static inline void pgalloc_tag_sub_pages(struct alloc_tag *tag, unsigned int nr)
static inline union codetag_ref *get_page_tag_ref(struct page *page) { return NULL; } static inline void put_page_tag_ref(union codetag_ref *ref) {} +static inline void clear_page_tag_ref(struct page *page) {} 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) {} diff --git a/mm/mm_init.c b/mm/mm_init.c index 75c3bd42799b..907c46b0773f 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -2460,15 +2460,7 @@ void __init memblock_free_pages(struct page *page, unsigned long pfn, }
/* pages were reserved and not allocated */ - if (mem_alloc_profiling_enabled()) { - union codetag_ref *ref = get_page_tag_ref(page); - - if (ref) { - set_codetag_empty(ref); - put_page_tag_ref(ref); - } - } - + clear_page_tag_ref(page); __free_pages_core(page, order, MEMINIT_EARLY); }
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 28f80daf5c04..3f80e94a0b66 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -5821,14 +5821,7 @@ unsigned long free_reserved_area(void *start, void *end, int poison, const char
void free_reserved_page(struct page *page) { - if (mem_alloc_profiling_enabled()) { - union codetag_ref *ref = get_page_tag_ref(page); - - if (ref) { - set_codetag_empty(ref); - put_page_tag_ref(ref); - } - } + clear_page_tag_ref(page); ClearPageReserved(page); init_page_count(page); __free_page(page);
base-commit: d74da846046aeec9333e802f5918bd3261fb5509
During CMA activation, pages in CMA area are prepared and then freed without being allocated. This triggers warnings when memory allocation debug config (CONFIG_MEM_ALLOC_PROFILING_DEBUG) is enabled. Fix this by marking these pages not tagged before freeing them.
Fixes: d224eb0287fb ("codetag: debug: mark codetags for reserved pages as empty") Signed-off-by: Suren Baghdasaryan surenb@google.com Cc: stable@vger.kernel.org # v6.10 --- Changes since v2 [1]: - Add and use clear_page_tag_ref helper, per David Hildenbrand
https://lore.kernel.org/all/20240812192428.151825-1-surenb@google.com/
mm/mm_init.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/mm/mm_init.c b/mm/mm_init.c index 907c46b0773f..13c4060bb01a 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -2245,6 +2245,8 @@ void __init init_cma_reserved_pageblock(struct page *page)
set_pageblock_migratetype(page, MIGRATE_CMA); set_page_refcounted(page); + /* pages were reserved and not allocated */ + clear_page_tag_ref(page); __free_pages(page, pageblock_order);
adjust_managed_page_count(page, pageblock_nr_pages);
On 13.08.24 17:07, Suren Baghdasaryan wrote:
During CMA activation, pages in CMA area are prepared and then freed without being allocated. This triggers warnings when memory allocation debug config (CONFIG_MEM_ALLOC_PROFILING_DEBUG) is enabled. Fix this by marking these pages not tagged before freeing them.
Fixes: d224eb0287fb ("codetag: debug: mark codetags for reserved pages as empty") Signed-off-by: Suren Baghdasaryan surenb@google.com Cc: stable@vger.kernel.org # v6.10
Changes since v2 [1]:
- Add and use clear_page_tag_ref helper, per David Hildenbrand
https://lore.kernel.org/all/20240812192428.151825-1-surenb@google.com/
mm/mm_init.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/mm/mm_init.c b/mm/mm_init.c index 907c46b0773f..13c4060bb01a 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -2245,6 +2245,8 @@ void __init init_cma_reserved_pageblock(struct page *page) set_pageblock_migratetype(page, MIGRATE_CMA); set_page_refcounted(page);
- /* pages were reserved and not allocated */
- clear_page_tag_ref(page); __free_pages(page, pageblock_order);
adjust_managed_page_count(page, pageblock_nr_pages);
Acked-by: David Hildenbrand david@redhat.com
On Tue, Aug 13, 2024 at 8:09 AM David Hildenbrand david@redhat.com wrote:
On 13.08.24 17:07, Suren Baghdasaryan wrote:
During CMA activation, pages in CMA area are prepared and then freed without being allocated. This triggers warnings when memory allocation debug config (CONFIG_MEM_ALLOC_PROFILING_DEBUG) is enabled. Fix this by marking these pages not tagged before freeing them.
Fixes: d224eb0287fb ("codetag: debug: mark codetags for reserved pages as empty") Signed-off-by: Suren Baghdasaryan surenb@google.com Cc: stable@vger.kernel.org # v6.10
Changes since v2 [1]:
- Add and use clear_page_tag_ref helper, per David Hildenbrand
https://lore.kernel.org/all/20240812192428.151825-1-surenb@google.com/
mm/mm_init.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/mm/mm_init.c b/mm/mm_init.c index 907c46b0773f..13c4060bb01a 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -2245,6 +2245,8 @@ void __init init_cma_reserved_pageblock(struct page *page)
set_pageblock_migratetype(page, MIGRATE_CMA); set_page_refcounted(page);
/* pages were reserved and not allocated */
clear_page_tag_ref(page); __free_pages(page, pageblock_order); adjust_managed_page_count(page, pageblock_nr_pages);
Acked-by: David Hildenbrand david@redhat.com
Thanks!
-- Cheers,
David / dhildenb
On Tue, 13 Aug 2024 08:07:57 -0700 Suren Baghdasaryan surenb@google.com wrote:
Fixes: d224eb0287fb ("codetag: debug: mark codetags for reserved pages as empty")
I copied this into [1/2] so everything lands nicely.
On Tue, Aug 13, 2024 at 11:40 AM Andrew Morton akpm@linux-foundation.org wrote:
On Tue, 13 Aug 2024 08:07:57 -0700 Suren Baghdasaryan surenb@google.com wrote:
Fixes: d224eb0287fb ("codetag: debug: mark codetags for reserved pages as empty")
I copied this into [1/2] so everything lands nicely.
Yeah, technically this does not "fix" that patch but since it's needed for the next patch I think that's fine.
On 13.08.24 17:07, Suren Baghdasaryan wrote:
In several cases we are freeing pages which were not allocated using common page allocators. For such cases, in order to keep allocation accounting correct, we should clear the page tag to indicate that the page being freed is expected to not have a valid allocation tag. Introduce clear_page_tag_ref() helper function to be used for this.
Suggested-by: David Hildenbrand david@redhat.com Signed-off-by: Suren Baghdasaryan surenb@google.com Cc: stable@vger.kernel.org # v6.10
Acked-by: David Hildenbrand david@redhat.com
On Tue, Aug 13, 2024 at 3:08 PM Suren Baghdasaryan surenb@google.com wrote:
In several cases we are freeing pages which were not allocated using common page allocators. For such cases, in order to keep allocation accounting correct, we should clear the page tag to indicate that the page being freed is expected to not have a valid allocation tag. Introduce clear_page_tag_ref() helper function to be used for this.
Reviewed-by: Pasha Tatashin pasha.tatashin@soleen.com
linux-stable-mirror@lists.linaro.org