Messages in this thread | | | Date | Wed, 28 Mar 2018 17:38:30 +0800 | From | Wei Yang <> | Subject | Re: [PATCH v3 4/5] arm64: introduce pfn_valid_region() |
| |
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@hxt-semitech.com> >--- > 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
| |