[Patch v2] mm/sparsemem: get address to page struct instead of address to pfn

From: Wei Yang
Date: Sun Feb 09 2020 - 19:51:08 EST


memmap should be the address to page struct instead of address to pfn.

As mentioned by David, if system memory and devmem sit within a
section, the mismatch address would lead kdump to dump unexpected
memory.

Since sub-section only works for SPARSEMEM_VMEMMAP, pfn_to_page() is
valid to get the page struct address at this point.

Fixes: ba72b4c8cf60 ("mm/sparsemem: support sub-section hotplug")
Signed-off-by: Wei Yang <richardw.yang@xxxxxxxxxxxxxxx>
CC: Dan Williams <dan.j.williams@xxxxxxxxx>
CC: David Hildenbrand <david@xxxxxxxxxx>
CC: Baoquan He <bhe@xxxxxxxxxx>

---
v2:
* adjust comment to mention the mismatch data would affect kdump

---
mm/sparse.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mm/sparse.c b/mm/sparse.c
index 586d85662978..4862ec2cfbc0 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -887,7 +887,7 @@ int __meminit sparse_add_section(int nid, unsigned long start_pfn,

/* Align memmap to section boundary in the subsection case */
if (section_nr_to_pfn(section_nr) != start_pfn)
- memmap = pfn_to_kaddr(section_nr_to_pfn(section_nr));
+ memmap = pfn_to_page(section_nr_to_pfn(section_nr));
sparse_init_one_section(ms, section_nr, memmap, ms->usage, 0);

return 0;
--
2.17.1