Re: [PATCH V3 2/2] arm64/mm: Reorganize pfn_valid()

2021-03-08 Thread Catalin Marinas
On Fri, Mar 05, 2021 at 10:54:58AM +0530, Anshuman Khandual wrote:
> There are multiple instances of pfn_to_section_nr() and __pfn_to_section()
> when CONFIG_SPARSEMEM is enabled. This can be optimized if memory section
> is fetched earlier. This replaces the open coded PFN and ADDR conversion
> with PFN_PHYS() and PHYS_PFN() helpers. While there, also add a comment.
> This does not cause any functional change.
> 
> Cc: Catalin Marinas 
> Cc: Will Deacon 
> Cc: Ard Biesheuvel 
> Cc: linux-arm-ker...@lists.infradead.org
> Cc: linux-kernel@vger.kernel.org
> Reviewed-by: David Hildenbrand 
> Signed-off-by: Anshuman Khandual 

Acked-by: Catalin Marinas 


[PATCH V3 2/2] arm64/mm: Reorganize pfn_valid()

2021-03-04 Thread Anshuman Khandual
There are multiple instances of pfn_to_section_nr() and __pfn_to_section()
when CONFIG_SPARSEMEM is enabled. This can be optimized if memory section
is fetched earlier. This replaces the open coded PFN and ADDR conversion
with PFN_PHYS() and PHYS_PFN() helpers. While there, also add a comment.
This does not cause any functional change.

Cc: Catalin Marinas 
Cc: Will Deacon 
Cc: Ard Biesheuvel 
Cc: linux-arm-ker...@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Reviewed-by: David Hildenbrand 
Signed-off-by: Anshuman Khandual 
---
 arch/arm64/mm/init.c | 21 -
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
index 5920c527845a..3685e12aba9b 100644
--- a/arch/arm64/mm/init.c
+++ b/arch/arm64/mm/init.c
@@ -219,16 +219,26 @@ static void __init zone_sizes_init(unsigned long min, 
unsigned long max)
 
 int pfn_valid(unsigned long pfn)
 {
-   phys_addr_t addr = pfn << PAGE_SHIFT;
+   phys_addr_t addr = PFN_PHYS(pfn);
 
-   if ((addr >> PAGE_SHIFT) != pfn)
+   /*
+* Ensure the upper PAGE_SHIFT bits are clear in the
+* pfn. Else it might lead to false positives when
+* some of the upper bits are set, but the lower bits
+* match a valid pfn.
+*/
+   if (PHYS_PFN(addr) != pfn)
return 0;
 
 #ifdef CONFIG_SPARSEMEM
+{
+   struct mem_section *ms;
+
if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS)
return 0;
 
-   if (!valid_section(__pfn_to_section(pfn)))
+   ms = __pfn_to_section(pfn);
+   if (!valid_section(ms))
return 0;
 
/*
@@ -240,8 +250,9 @@ int pfn_valid(unsigned long pfn)
 * memory sections covering all of hotplug memory including
 * both normal and ZONE_DEVICE based.
 */
-   if (!early_section(__pfn_to_section(pfn)))
-   return pfn_section_valid(__pfn_to_section(pfn), pfn);
+   if (!early_section(ms))
+   return pfn_section_valid(ms, pfn);
+}
 #endif
return memblock_is_map_memory(addr);
 }
-- 
2.20.1