linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/7] Cleanup free_pages() misuse
@ 2025-08-26 19:32 Vishal Moola (Oracle)
  2025-08-26 19:32 ` [PATCH 1/7] mm/page_alloc: Add kernel-docs for free_pages() Vishal Moola (Oracle)
                   ` (6 more replies)
  0 siblings, 7 replies; 11+ messages in thread
From: Vishal Moola (Oracle) @ 2025-08-26 19:32 UTC (permalink / raw)
  To: linux-mm; +Cc: linux-kernel, Andrew Morton, Vishal Moola (Oracle)

free_pages() is supposed to be called when we only have a virtual address.
__free_pages() is supposed to be called when we have a page.

There are a number of callers that use page_address() to get a page's
virtual address then call free_pages() on it when they should just call
__free_pages() directly.

Add kernel-docs for free_pages() to help callers better understand which
function they should be calling, and replace the obvious cases of
misuse.

-----------------
Based on mm-new. I intend to have all of these taken through the mm tree.

I've split the patches into separate subsystems to make it easier to
resolve conflicts, but there aren't any functional changes.

Vishal Moola (Oracle) (7):
  mm/page_alloc: Add kernel-docs for free_pages()
  aoe: Stop calling page_address() in free_page()
  x86: Stop calling page_address() in free_pages()
  riscv: Stop calling page_address() in free_pages()
  powerpc: Stop calling page_address() in free_pages()
  arm64: Stop calling page_address() in free_pages()
  virtio_balloon: Stop calling page_address() in free_pages()

 arch/arm64/mm/mmu.c                      | 2 +-
 arch/powerpc/mm/book3s64/radix_pgtable.c | 2 +-
 arch/riscv/mm/init.c                     | 4 ++--
 arch/x86/mm/init_64.c                    | 2 +-
 arch/x86/platform/efi/memmap.c           | 2 +-
 drivers/block/aoe/aoecmd.c               | 2 +-
 drivers/virtio/virtio_balloon.c          | 3 +--
 mm/page_alloc.c                          | 9 +++++++++
 8 files changed, 17 insertions(+), 9 deletions(-)

-- 
2.51.0



^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/7] mm/page_alloc: Add kernel-docs for free_pages()
  2025-08-26 19:32 [PATCH 0/7] Cleanup free_pages() misuse Vishal Moola (Oracle)
@ 2025-08-26 19:32 ` Vishal Moola (Oracle)
  2025-08-26 19:38   ` Matthew Wilcox
  2025-08-26 19:32 ` [PATCH 2/7] aoe: Stop calling page_address() in free_page() Vishal Moola (Oracle)
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 11+ messages in thread
From: Vishal Moola (Oracle) @ 2025-08-26 19:32 UTC (permalink / raw)
  To: linux-mm; +Cc: linux-kernel, Andrew Morton, Vishal Moola (Oracle)

Add kernel-docs to free_pages(). This will help callers understand when
to use it instead of __free_pages().

Signed-off-by: Vishal Moola (Oracle) <vishal.moola@gmail.com>
---
 mm/page_alloc.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index baead29b3e67..6ee8f450c078 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5270,6 +5270,15 @@ void free_pages_nolock(struct page *page, unsigned int order)
 	___free_pages(page, order, FPI_TRYLOCK);
 }
 
+/**
+ * free_pages - Free pages allocated with alloc_pages().
+ * @addr: The virtual address tied to a page returned from alloc_pages().
+ * @order: The order of the allocation.
+ *
+ * This function behaves the same as __free_pages(). Use this function
+ * to free pages when you only have a valid virtual address. If you have
+ * the page, call __free_pages() instead.
+ */
 void free_pages(unsigned long addr, unsigned int order)
 {
 	if (addr != 0) {
-- 
2.51.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/7] aoe: Stop calling page_address() in free_page()
  2025-08-26 19:32 [PATCH 0/7] Cleanup free_pages() misuse Vishal Moola (Oracle)
  2025-08-26 19:32 ` [PATCH 1/7] mm/page_alloc: Add kernel-docs for free_pages() Vishal Moola (Oracle)
@ 2025-08-26 19:32 ` Vishal Moola (Oracle)
  2025-08-26 19:41   ` Matthew Wilcox
  2025-08-26 19:32 ` [PATCH 3/7] x86: Stop calling page_address() in free_pages() Vishal Moola (Oracle)
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 11+ messages in thread
From: Vishal Moola (Oracle) @ 2025-08-26 19:32 UTC (permalink / raw)
  To: linux-mm; +Cc: linux-kernel, Andrew Morton, Vishal Moola (Oracle)

free_page() should be used when we only have a virtual address. We
should call __free_page() directly on our page instead.

Signed-off-by: Vishal Moola (Oracle) <vishal.moola@gmail.com>
---
 drivers/block/aoe/aoecmd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c
index 6298f8e271e3..a9affb7c264d 100644
--- a/drivers/block/aoe/aoecmd.c
+++ b/drivers/block/aoe/aoecmd.c
@@ -1761,6 +1761,6 @@ aoecmd_exit(void)
 	kfree(kts);
 	kfree(ktiowq);
 
-	free_page((unsigned long) page_address(empty_page));
+	__free_page(empty_page);
 	empty_page = NULL;
 }
-- 
2.51.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/7] x86: Stop calling page_address() in free_pages()
  2025-08-26 19:32 [PATCH 0/7] Cleanup free_pages() misuse Vishal Moola (Oracle)
  2025-08-26 19:32 ` [PATCH 1/7] mm/page_alloc: Add kernel-docs for free_pages() Vishal Moola (Oracle)
  2025-08-26 19:32 ` [PATCH 2/7] aoe: Stop calling page_address() in free_page() Vishal Moola (Oracle)
@ 2025-08-26 19:32 ` Vishal Moola (Oracle)
  2025-08-26 19:32 ` [PATCH 4/7] riscv: " Vishal Moola (Oracle)
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Vishal Moola (Oracle) @ 2025-08-26 19:32 UTC (permalink / raw)
  To: linux-mm; +Cc: linux-kernel, Andrew Morton, Vishal Moola (Oracle)

free_pages() should be used when we only have a virtual address. We
should call __free_pages() directly on our page instead.

Signed-off-by: Vishal Moola (Oracle) <vishal.moola@gmail.com>
---
 arch/x86/mm/init_64.c          | 2 +-
 arch/x86/platform/efi/memmap.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index b9426fce5f3e..0e4270e20fad 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -1031,7 +1031,7 @@ static void __meminit free_pagetable(struct page *page, int order)
 		free_reserved_pages(page, nr_pages);
 #endif
 	} else {
-		free_pages((unsigned long)page_address(page), order);
+		__free_pages(page, order);
 	}
 }
 
diff --git a/arch/x86/platform/efi/memmap.c b/arch/x86/platform/efi/memmap.c
index 061b8ecc71a1..023697c88910 100644
--- a/arch/x86/platform/efi/memmap.c
+++ b/arch/x86/platform/efi/memmap.c
@@ -42,7 +42,7 @@ void __init __efi_memmap_free(u64 phys, unsigned long size, unsigned long flags)
 		struct page *p = pfn_to_page(PHYS_PFN(phys));
 		unsigned int order = get_order(size);
 
-		free_pages((unsigned long) page_address(p), order);
+		__free_pages(p, order);
 	}
 }
 
-- 
2.51.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/7] riscv: Stop calling page_address() in free_pages()
  2025-08-26 19:32 [PATCH 0/7] Cleanup free_pages() misuse Vishal Moola (Oracle)
                   ` (2 preceding siblings ...)
  2025-08-26 19:32 ` [PATCH 3/7] x86: Stop calling page_address() in free_pages() Vishal Moola (Oracle)
@ 2025-08-26 19:32 ` Vishal Moola (Oracle)
  2025-08-26 19:32 ` [PATCH 5/7] powerpc: " Vishal Moola (Oracle)
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Vishal Moola (Oracle) @ 2025-08-26 19:32 UTC (permalink / raw)
  To: linux-mm; +Cc: linux-kernel, Andrew Morton, Vishal Moola (Oracle)

free_pages() should be used when we only have a virtual address. We
should call __free_pages() directly on our page instead.

Signed-off-by: Vishal Moola (Oracle) <vishal.moola@gmail.com>
---
 arch/riscv/mm/init.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
index 15683ae13fa5..1056c11d3251 100644
--- a/arch/riscv/mm/init.c
+++ b/arch/riscv/mm/init.c
@@ -1624,7 +1624,7 @@ static void __meminit free_pud_table(pud_t *pud_start, p4d_t *p4d)
 	if (PageReserved(page))
 		free_reserved_page(page);
 	else
-		free_pages((unsigned long)page_address(page), 0);
+		__free_pages(page, 0);
 	p4d_clear(p4d);
 }
 
@@ -1646,7 +1646,7 @@ static void __meminit free_vmemmap_storage(struct page *page, size_t size,
 		return;
 	}
 
-	free_pages((unsigned long)page_address(page), order);
+	__free_pages(page, order);
 }
 
 static void __meminit remove_pte_mapping(pte_t *pte_base, unsigned long addr, unsigned long end,
-- 
2.51.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 5/7] powerpc: Stop calling page_address() in free_pages()
  2025-08-26 19:32 [PATCH 0/7] Cleanup free_pages() misuse Vishal Moola (Oracle)
                   ` (3 preceding siblings ...)
  2025-08-26 19:32 ` [PATCH 4/7] riscv: " Vishal Moola (Oracle)
@ 2025-08-26 19:32 ` Vishal Moola (Oracle)
  2025-08-26 19:32 ` [PATCH 6/7] arm64: " Vishal Moola (Oracle)
  2025-08-26 19:32 ` [PATCH 7/7] virtio_balloon: " Vishal Moola (Oracle)
  6 siblings, 0 replies; 11+ messages in thread
From: Vishal Moola (Oracle) @ 2025-08-26 19:32 UTC (permalink / raw)
  To: linux-mm; +Cc: linux-kernel, Andrew Morton, Vishal Moola (Oracle)

free_pages() should be used when we only have a virtual address. We
should call __free_pages() directly on our page instead.

Signed-off-by: Vishal Moola (Oracle) <vishal.moola@gmail.com>
---
 arch/powerpc/mm/book3s64/radix_pgtable.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/powerpc/mm/book3s64/radix_pgtable.c b/arch/powerpc/mm/book3s64/radix_pgtable.c
index be523e5fe9c5..73977dbabcf2 100644
--- a/arch/powerpc/mm/book3s64/radix_pgtable.c
+++ b/arch/powerpc/mm/book3s64/radix_pgtable.c
@@ -780,7 +780,7 @@ static void __meminit free_vmemmap_pages(struct page *page,
 		while (nr_pages--)
 			free_reserved_page(page++);
 	} else
-		free_pages((unsigned long)page_address(page), order);
+		__free_pages(page, order);
 }
 
 static void __meminit remove_pte_table(pte_t *pte_start, unsigned long addr,
-- 
2.51.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6/7] arm64: Stop calling page_address() in free_pages()
  2025-08-26 19:32 [PATCH 0/7] Cleanup free_pages() misuse Vishal Moola (Oracle)
                   ` (4 preceding siblings ...)
  2025-08-26 19:32 ` [PATCH 5/7] powerpc: " Vishal Moola (Oracle)
@ 2025-08-26 19:32 ` Vishal Moola (Oracle)
  2025-08-26 19:32 ` [PATCH 7/7] virtio_balloon: " Vishal Moola (Oracle)
  6 siblings, 0 replies; 11+ messages in thread
From: Vishal Moola (Oracle) @ 2025-08-26 19:32 UTC (permalink / raw)
  To: linux-mm; +Cc: linux-kernel, Andrew Morton, Vishal Moola (Oracle)

free_pages() should be used when we only have a virtual address. We
should call __free_pages() directly on our page instead.

Signed-off-by: Vishal Moola (Oracle) <vishal.moola@gmail.com>
---
 arch/arm64/mm/mmu.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index 34e5d78af076..e14a75d0dbd3 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c
@@ -843,7 +843,7 @@ static void free_hotplug_page_range(struct page *page, size_t size,
 		vmem_altmap_free(altmap, size >> PAGE_SHIFT);
 	} else {
 		WARN_ON(PageReserved(page));
-		free_pages((unsigned long)page_address(page), get_order(size));
+		__free_pages(page, get_order(size));
 	}
 }
 
-- 
2.51.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 7/7] virtio_balloon: Stop calling page_address() in free_pages()
  2025-08-26 19:32 [PATCH 0/7] Cleanup free_pages() misuse Vishal Moola (Oracle)
                   ` (5 preceding siblings ...)
  2025-08-26 19:32 ` [PATCH 6/7] arm64: " Vishal Moola (Oracle)
@ 2025-08-26 19:32 ` Vishal Moola (Oracle)
  6 siblings, 0 replies; 11+ messages in thread
From: Vishal Moola (Oracle) @ 2025-08-26 19:32 UTC (permalink / raw)
  To: linux-mm; +Cc: linux-kernel, Andrew Morton, Vishal Moola (Oracle)

free_pages() should be used when we only have a virtual address. We
should call __free_pages() directly on our page instead.

Signed-off-by: Vishal Moola (Oracle) <vishal.moola@gmail.com>
---
 drivers/virtio/virtio_balloon.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index eae65136cdfb..d4e6865ce355 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -488,8 +488,7 @@ static unsigned long return_free_pages_to_mm(struct virtio_balloon *vb,
 		page = balloon_page_pop(&vb->free_page_list);
 		if (!page)
 			break;
-		free_pages((unsigned long)page_address(page),
-			   VIRTIO_BALLOON_HINT_BLOCK_ORDER);
+		__free_pages(page, VIRTIO_BALLOON_HINT_BLOCK_ORDER);
 	}
 	vb->num_free_page_blocks -= num_returned;
 	spin_unlock_irq(&vb->free_page_list_lock);
-- 
2.51.0



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/7] mm/page_alloc: Add kernel-docs for free_pages()
  2025-08-26 19:32 ` [PATCH 1/7] mm/page_alloc: Add kernel-docs for free_pages() Vishal Moola (Oracle)
@ 2025-08-26 19:38   ` Matthew Wilcox
  0 siblings, 0 replies; 11+ messages in thread
From: Matthew Wilcox @ 2025-08-26 19:38 UTC (permalink / raw)
  To: Vishal Moola (Oracle); +Cc: linux-mm, linux-kernel, Andrew Morton

On Tue, Aug 26, 2025 at 12:32:52PM -0700, Vishal Moola (Oracle) wrote:
> +/**
> + * free_pages - Free pages allocated with alloc_pages().

I might reference get_free_pages() here instead of alloc_pages().
We used to have a wonderful document that explained that there was one
allocator with two namespaces to access it; alloc_pages()/__free_pages()
and get_free_pages()/free_pages().  I don't know what happened to it.

Other than that,

Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/7] aoe: Stop calling page_address() in free_page()
  2025-08-26 19:32 ` [PATCH 2/7] aoe: Stop calling page_address() in free_page() Vishal Moola (Oracle)
@ 2025-08-26 19:41   ` Matthew Wilcox
  2025-08-26 20:12     ` Vishal Moola (Oracle)
  0 siblings, 1 reply; 11+ messages in thread
From: Matthew Wilcox @ 2025-08-26 19:41 UTC (permalink / raw)
  To: Vishal Moola (Oracle)
  Cc: linux-mm, linux-kernel, Andrew Morton, Justin Sanders, Jens Axboe,
	linux-block

On Tue, Aug 26, 2025 at 12:32:53PM -0700, Vishal Moola (Oracle) wrote:
> free_page() should be used when we only have a virtual address. We
> should call __free_page() directly on our page instead.
> 
> Signed-off-by: Vishal Moola (Oracle) <vishal.moola@gmail.com>

Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>

Probably should have run ./scripts/get_maintainer.pl drivers/block/aoe/aoecmd.c
Adding ccs.

>  drivers/block/aoe/aoecmd.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c
> index 6298f8e271e3..a9affb7c264d 100644
> --- a/drivers/block/aoe/aoecmd.c
> +++ b/drivers/block/aoe/aoecmd.c
> @@ -1761,6 +1761,6 @@ aoecmd_exit(void)
>  	kfree(kts);
>  	kfree(ktiowq);
>  
> -	free_page((unsigned long) page_address(empty_page));
> +	__free_page(empty_page);
>  	empty_page = NULL;
>  }
> -- 
> 2.51.0
> 
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/7] aoe: Stop calling page_address() in free_page()
  2025-08-26 19:41   ` Matthew Wilcox
@ 2025-08-26 20:12     ` Vishal Moola (Oracle)
  0 siblings, 0 replies; 11+ messages in thread
From: Vishal Moola (Oracle) @ 2025-08-26 20:12 UTC (permalink / raw)
  To: Matthew Wilcox
  Cc: linux-mm, linux-kernel, Andrew Morton, Justin Sanders, Jens Axboe,
	linux-block

On Tue, Aug 26, 2025 at 08:41:03PM +0100, Matthew Wilcox wrote:
> On Tue, Aug 26, 2025 at 12:32:53PM -0700, Vishal Moola (Oracle) wrote:
> > free_page() should be used when we only have a virtual address. We
> > should call __free_page() directly on our page instead.
> > 
> > Signed-off-by: Vishal Moola (Oracle) <vishal.moola@gmail.com>
> 
> Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> 
> Probably should have run ./scripts/get_maintainer.pl drivers/block/aoe/aoecmd.c
> Adding ccs.

Ah I thought I did that... seems I messed up some formatting and none of
the ccs got added :/. I'll send out a v2 later today with all the ccs
added.

> >  drivers/block/aoe/aoecmd.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c
> > index 6298f8e271e3..a9affb7c264d 100644
> > --- a/drivers/block/aoe/aoecmd.c
> > +++ b/drivers/block/aoe/aoecmd.c
> > @@ -1761,6 +1761,6 @@ aoecmd_exit(void)
> >  	kfree(kts);
> >  	kfree(ktiowq);
> >  
> > -	free_page((unsigned long) page_address(empty_page));
> > +	__free_page(empty_page);
> >  	empty_page = NULL;
> >  }
> > -- 
> > 2.51.0
> > 
> > 


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2025-08-26 20:12 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-26 19:32 [PATCH 0/7] Cleanup free_pages() misuse Vishal Moola (Oracle)
2025-08-26 19:32 ` [PATCH 1/7] mm/page_alloc: Add kernel-docs for free_pages() Vishal Moola (Oracle)
2025-08-26 19:38   ` Matthew Wilcox
2025-08-26 19:32 ` [PATCH 2/7] aoe: Stop calling page_address() in free_page() Vishal Moola (Oracle)
2025-08-26 19:41   ` Matthew Wilcox
2025-08-26 20:12     ` Vishal Moola (Oracle)
2025-08-26 19:32 ` [PATCH 3/7] x86: Stop calling page_address() in free_pages() Vishal Moola (Oracle)
2025-08-26 19:32 ` [PATCH 4/7] riscv: " Vishal Moola (Oracle)
2025-08-26 19:32 ` [PATCH 5/7] powerpc: " Vishal Moola (Oracle)
2025-08-26 19:32 ` [PATCH 6/7] arm64: " Vishal Moola (Oracle)
2025-08-26 19:32 ` [PATCH 7/7] virtio_balloon: " Vishal Moola (Oracle)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).