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