Re: [PATCH v5 3/4] x86/vmemmap: Handle unpopulated sub-pmd ranges
From: David Hildenbrand <hidden>
Date: 2021-03-09 17:53:47
Also in:
lkml
On 09.03.21 18:41, Oscar Salvador wrote:
quoted hunk ↗ jump to hunk
When sizeof(struct page) is not a power of 2, sections do not span a PMD anymore and so when populating them some parts of the PMD will remain unused. Because of this, PMDs will be left behind when depopulating sections since remove_pmd_table() thinks that those unused parts are still in use. Fix this by marking the unused parts with PAGE_UNUSED, so memchr_inv() will do the right thing and will let us free the PMD when the last user of it is gone. This patch is based on a similar patch by David Hildenbrand: https://lore.kernel.org/linux-mm/20200722094558.9828-9-david@redhat.com/ (local) Signed-off-by: Oscar Salvador <osalvador@suse.de> Reviewed-by: David Hildenbrand <redacted> --- arch/x86/mm/init_64.c | 63 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 11 deletions(-)diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 9ecb3c488ac8..3bb3988c7681 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c@@ -871,7 +871,50 @@ int arch_add_memory(int nid, u64 start, u64 size, return add_pages(nid, start_pfn, nr_pages, params); } -#define PAGE_INUSE 0xFD +#ifdef CONFIG_SPARSEMEM_VMEMMAP +#define PAGE_UNUSED 0xFD + +/* Returns true if the PMD is completely unused and thus it can be freed */ +static bool __meminit vmemmap_pmd_is_unused(unsigned long addr, unsigned long end) +{
I don't think the new name is any better. It implies that all it does is a check - yet it actually clears the given range. (I prefer the old name, but well, I came up with that, so what do I know :D ) -- Thanks, David / dhildenb