Re: [PATCH] x86/vmemmap: Handle unpopulated sub-pmd ranges

From: David Hildenbrand
Date: Wed Jan 27 2021 - 06:35:55 EST


On 27.01.21 12:23, Oscar Salvador wrote:
When the size of a struct page is not multiple of 2MB, 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_INUSE, 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@xxxxxxxxxx/
https://lore.kernel.org/linux-mm/20200722094558.9828-10-david@xxxxxxxxxx/

Signed-off-by: Oscar Salvador <osalvador@xxxxxxx>
---
arch/x86/mm/init_64.c | 81 +++++++++++++++++++++++++++++++++++++++----
1 file changed, 74 insertions(+), 7 deletions(-)

diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index b5a3fa4033d3..9b6d45ea353b 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -873,6 +873,71 @@ int arch_add_memory(int nid, u64 start, u64 size,
#define PAGE_INUSE 0xFD

Note that I called it "PAGE_UNUSED", using "PAGE_INUSE" might make it a little harder to digest.

--
Thanks,

David / dhildenb