On 1/4/21 9:06 PM, Jonathan Cameron wrote: > On Tue, 22 Dec 2020 12:42:23 +0530 > Anshuman Khandual <[email protected]> wrote: > >> pfn_valid() validates a pfn but basically it checks for a valid struct page >> backing for that pfn. It should always return positive for memory ranges >> backed with struct page mapping. But currently pfn_valid() fails for all >> ZONE_DEVICE based memory types even though they have struct page mapping. >> >> pfn_valid() asserts that there is a memblock entry for a given pfn without >> MEMBLOCK_NOMAP flag being set. The problem with ZONE_DEVICE based memory is >> that they do not have memblock entries. Hence memblock_is_map_memory() will >> invariably fail via memblock_search() for a ZONE_DEVICE based address. This >> eventually fails pfn_valid() which is wrong. memblock_is_map_memory() needs >> to be skipped for such memory ranges. As ZONE_DEVICE memory gets hotplugged >> into the system via memremap_pages() called from a driver, their respective >> memory sections will not have SECTION_IS_EARLY set. >> >> Normal hotplug memory will never have MEMBLOCK_NOMAP set in their memblock >> regions. Because the flag MEMBLOCK_NOMAP was specifically designed and set >> for firmware reserved memory regions. memblock_is_map_memory() can just be >> skipped as its always going to be positive and that will be an optimization >> for the normal hotplug memory. Like ZONE_DEVIE based memory, all hotplugged > > typo: ZONE_DEVIE > >> normal memory too will not have SECTION_IS_EARLY set for their sections. >> >> Skipping memblock_is_map_memory() for all non early memory sections would >> fix pfn_valid() problem for ZONE_DEVICE based memory and also improve its >> performance for normal hotplug memory as well. >> >> Cc: Catalin Marinas <[email protected]> >> Cc: Will Deacon <[email protected]> >> Cc: Ard Biesheuvel <[email protected]> >> Cc: Robin Murphy <[email protected]> >> Cc: [email protected] >> Cc: [email protected] >> Fixes: 73b20c84d42d ("arm64: mm: implement pte_devmap support") >> Signed-off-by: Anshuman Khandual <[email protected]> >> --- >> arch/arm64/mm/init.c | 12 ++++++++++++ >> 1 file changed, 12 insertions(+) >> >> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c >> index 75addb36354a..ee23bda00c28 100644 >> --- a/arch/arm64/mm/init.c >> +++ b/arch/arm64/mm/init.c >> @@ -225,6 +225,18 @@ int pfn_valid(unsigned long pfn) >> >> if (!valid_section(__pfn_to_section(pfn))) >> return 0; >> + >> + /* >> + * ZONE_DEVICE memory does not have the memblock entries. >> + * memblock_is_map_memory() check for ZONE_DEVICE based >> + * addresses will always fail. Even the normal hotplugged >> + * memory will never have MEMBLOCK_NOMAP flag set in their >> + * memblock entries. Skip memblock search for all non early >> + * memory sections covering all of hotplug memory including >> + * both normal and ZONE_DEVIE based. > > Here as well + the cover letter title.
My bad, will fix all the three instances.

