x86: janitor CPA statistics patch
authorThomas Gleixner <tglx@linutronix.de>
Mon, 5 May 2008 14:35:21 +0000 (16:35 +0200)
committerIngo Molnar <mingo@elte.hu>
Tue, 8 Jul 2008 06:12:05 +0000 (08:12 +0200)
1) Remove __meminit from update_pages_count. It is used inside
split_pages()

2) Make the code depend on PROC_FS. Doing statistics for nothing is
useless and not adding useless code is nice to the Linux tiny folks.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/mm/pageattr.c
include/asm-x86/pgtable.h

index 668205b..0a3f5e0 100644 (file)
@@ -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.
index 111564f..bd26559 100644 (file)
@@ -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