diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 668205bca15eb46ae3a6871294b08e7943364190..0a3f5e047f8995aafe9ba097b9f5e4234b84ce6a 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c @@ -34,18 +34,40 @@ struct cpa_data { unsigned force_split : 1; }; +#ifdef CONFIG_PROC_FS static unsigned long direct_pages_count[PG_LEVEL_NUM]; -void __meminit update_page_count(int level, unsigned long pages) +void update_page_count(int level, unsigned long pages) { -#ifdef CONFIG_PROC_FS unsigned long flags; + /* Protect against CPA */ spin_lock_irqsave(&pgd_lock, flags); direct_pages_count[level] += pages; spin_unlock_irqrestore(&pgd_lock, flags); +} + +static void split_page_count(int level) +{ + direct_pages_count[level]--; + direct_pages_count[level - 1] += PTRS_PER_PTE; +} + +int arch_report_meminfo(char *page) +{ + int n = sprintf(page, "DirectMap4k: %8lu\n" + "DirectMap2M: %8lu\n", + direct_pages_count[PG_LEVEL_4K], + direct_pages_count[PG_LEVEL_2M]); +#ifdef CONFIG_X86_64 + n += sprintf(page + n, "DirectMap1G: %8lu\n", + direct_pages_count[PG_LEVEL_1G]); #endif + return n; } +#else +static inline void split_page_count(int level) { } +#endif #ifdef CONFIG_X86_64 @@ -514,10 +536,8 @@ static int split_large_page(pte_t *kpte, unsigned long address) set_pte(&pbase[i], pfn_pte(pfn, ref_prot)); if (address >= (unsigned long)__va(0) && - address < (unsigned long)__va(max_pfn_mapped << PAGE_SHIFT)) { - direct_pages_count[level]--; - direct_pages_count[level - 1] += PTRS_PER_PTE; - } + address < (unsigned long)__va(max_pfn_mapped << PAGE_SHIFT)) + split_page_count(level); /* * Install the new, split up pagetable. Important details here: @@ -1048,22 +1068,6 @@ bool kernel_page_present(struct page *page) #endif /* CONFIG_DEBUG_PAGEALLOC */ -#ifdef CONFIG_PROC_FS -int arch_report_meminfo(char *page) -{ - int n; - n = sprintf(page, "DirectMap4k: %8lu\n" - "DirectMap2M: %8lu\n", - direct_pages_count[PG_LEVEL_4K], - direct_pages_count[PG_LEVEL_2M]); -#ifdef CONFIG_X86_64 - n += sprintf(page + n, "DirectMap1G: %8lu\n", - direct_pages_count[PG_LEVEL_1G]); -#endif - return n; -} -#endif - /* * The testcases use internal knowledge of the implementation that shouldn't * be exposed to the rest of the kernel. Include these directly here. diff --git a/include/asm-x86/pgtable.h b/include/asm-x86/pgtable.h index 111564fa5e70b1aaa6cda2188cf22444edcecd5a..bd26559dc8e8abdba893697410f6fb3a510206c8 100644 --- a/include/asm-x86/pgtable.h +++ b/include/asm-x86/pgtable.h @@ -372,7 +372,11 @@ enum { PG_LEVEL_NUM }; -void update_page_count(int level, unsigned long pages); +#ifdef CONFIG_PROC_FS +extern void update_page_count(int level, unsigned long pages); +#else +static inline void update_page_count(int level, unsigned long pages) { } +#endif /* * Helper function that returns the kernel pagetable entry controlling