On Sun, Mar 25, 2018 at 08:02:18PM -0700, Jia He wrote: >This is the preparation for further optimizing in early_pfn_valid >on arm64. > >Signed-off-by: Jia He <jia.he@xxxxxxxxxxxxxxxx> >--- > arch/arm64/include/asm/page.h | 3 ++- > arch/arm64/mm/init.c | 25 ++++++++++++++++++++++++- > 2 files changed, 26 insertions(+), 2 deletions(-) > >diff --git a/arch/arm64/include/asm/page.h b/arch/arm64/include/asm/page.h >index 60d02c8..da2cba3 100644 >--- a/arch/arm64/include/asm/page.h >+++ b/arch/arm64/include/asm/page.h >@@ -38,7 +38,8 @@ extern void clear_page(void *to); > typedef struct page *pgtable_t; > > #ifdef CONFIG_HAVE_ARCH_PFN_VALID >-extern int pfn_valid(unsigned long); >+extern int pfn_valid(unsigned long pfn); >+extern int pfn_valid_region(unsigned long pfn, int *last_idx); > #endif > > #include <asm/memory.h> >diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c >index 00e7b90..06433d5 100644 >--- a/arch/arm64/mm/init.c >+++ b/arch/arm64/mm/init.c >@@ -290,7 +290,30 @@ int pfn_valid(unsigned long pfn) > return memblock_is_map_memory(pfn << PAGE_SHIFT); > } > EXPORT_SYMBOL(pfn_valid); >-#endif >+ >+int pfn_valid_region(unsigned long pfn, int *last_idx) >+{ >+ unsigned long start_pfn, end_pfn; >+ struct memblock_type *type = &memblock.memory; >+ >+ if (*last_idx != -1) { >+ start_pfn = PFN_DOWN(type->regions[*last_idx].base); PFN_UP() should be used. >+ end_pfn= PFN_DOWN(type->regions[*last_idx].base + >+ type->regions[*last_idx].size); >+ >+ if (pfn >= start_pfn && pfn < end_pfn) >+ return !memblock_is_nomap( >+ &memblock.memory.regions[*last_idx]); Could use type->regions directly. >+ } >+ >+ *last_idx = memblock_search_pfn_regions(pfn); >+ if (*last_idx == -1) >+ return false; >+ >+ return !memblock_is_nomap(&memblock.memory.regions[*last_idx]); Could use type->regions directly. Well, since your check memblock.memory.regions, how about use a variable equals memblock.memory.regions directly instead of type->regions? For example: struct memblock_region *regions = memblock.memory.regions; >+} >+EXPORT_SYMBOL(pfn_valid_region); >+#endif /*CONFIG_HAVE_ARCH_PFN_VALID*/ > > #ifndef CONFIG_SPARSEMEM > static void __init arm64_memory_present(void) >-- >2.7.4 -- Wei Yang Help you, Help me