Messages in this thread |  | | Date | Tue, 28 Apr 2026 21:36:58 +0200 | | Subject | Re: [PATCH] x86/mm: fix freeing of PMD-sized vmemmap pages | | From | "David Hildenbrand (Arm)" <> |
| |
On 4/28/26 15:20, Lance Yang wrote: > > On Tue, Apr 28, 2026 at 12:29:36PM +0200, David Hildenbrand (Arm) wrote: >> In commit bf9e4e30f353 ("x86/mm: use pagetable_free()"), we switched >>from freeing non-boot page tables through __free_pages() to >> pagetable_free(). >> >> However, the function is also called to free vmemmap pages. >> >> Given that vmemmap pages are not page tables, already the page_ptdesc(page) >> is wrong. But worse, pagetable_free() calls >> >> __free_pages(page, compound_order(page)); >> >> As vmemmap pages are not compound pages (see vmemmap_alloc_block()) -- >> except for HVO, which doesn't apply here -- we will only free the first >> page when freeing a PMD-sized vmemmap page, leaking the other ones. >> >> Fix it by properly decoupling pagetable and vmemmap freeing. >> free_pagetable() no longer has to mess with SECTION_INFO, as only the >> vmemmap is marked like that in register_page_bootmem_memmap(). >> >> While at it, just wire up the altmap parameter for remove_pte_table(). >> Also, the indentation in remove_pmd_table() is messed up, let's fix that >> while touching it. >> >> Note that we'll try to get rid of that bootmem info handling soon. For >> now, we'll handle it similar to free_pagetable(), just avoiding the >> ifdef. >> >> Fixes: bf9e4e30f353 ("x86/mm: use pagetable_free()") >> Cc: stable@vger.kernel.org >> Signed-off-by: David Hildenbrand (Arm) <david@kernel.org> >> --- >> Reproduced and tested with a simple VM with a virtio-mem device, >> repeatedly adding and removing memory. >> >> Found by code inspection while working on bootmem_info removal. >> --- > > Cool! I just reproduced the leak with QEMU pc-dimm memory hotplug as > well. > > Without the fix, nr_free_pages kept dropping after the hotplugged memory > was removed again. With the fix applied, it stays stable over repeated > add/remove cycles :) > > Tested-by: Lance Yang <lance.yang@linux.dev>
Thanks Lance! I'll wait a bit more for feedback, and then resend v2 with the "nr_pages" simplification.
-- Cheers,
David
|  |