mm: teach pfn_to_online_page() to consider subsection validity
pfn_to_online_page is primarily used to filter out offline or fully
uninitialized pages. pfn_valid resp. online_section_nr have a coarse
per memory section granularity. If a section shared with a partially
offline memory (e.g. part of ZONE_DEVICE) then pfn_to_online_page
would lead to a false positive on some pfns. Fix this by adding
pfn_section_valid check which is subsection aware.
[mhocko@kernel.org: changelog rewrite]
Link: https://lkml.kernel.org/r/161058500148.1840162.4365921007820501696.stgit@dwillia2-desk3.amr.corp.intel.com
Fixes: b13bc35193
("mm/hotplug: invalid PFNs from pfn_to_online_page()")
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Reported-by: David Hildenbrand <david@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Oscar Salvador <osalvador@suse.de>
Acked-by: Michal Hocko <mhocko@suse.com>
Cc: Qian Cai <cai@lca.pw>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Naoya Horiguchi <naoya.horiguchi@nec.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
9f605f2605
commit
9f9b02e5b3
|
@ -308,11 +308,26 @@ static int check_hotplug_memory_addressable(unsigned long pfn,
|
|||
struct page *pfn_to_online_page(unsigned long pfn)
|
||||
{
|
||||
unsigned long nr = pfn_to_section_nr(pfn);
|
||||
struct mem_section *ms;
|
||||
|
||||
if (nr < NR_MEM_SECTIONS && online_section_nr(nr) &&
|
||||
pfn_valid_within(pfn))
|
||||
return pfn_to_page(pfn);
|
||||
return NULL;
|
||||
if (nr >= NR_MEM_SECTIONS)
|
||||
return NULL;
|
||||
|
||||
ms = __nr_to_section(nr);
|
||||
if (!online_section(ms))
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Save some code text when online_section() +
|
||||
* pfn_section_valid() are sufficient.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_HAVE_ARCH_PFN_VALID) && !pfn_valid(pfn))
|
||||
return NULL;
|
||||
|
||||
if (!pfn_section_valid(ms, pfn))
|
||||
return NULL;
|
||||
|
||||
return pfn_to_page(pfn);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pfn_to_online_page);
|
||||
|
||||
|
|
Loading…
Reference in New Issue