x86, mm: Merge alloc_low_page between 64bit and 32bit
authorYinghai Lu <yinghai@kernel.org>
Sat, 17 Nov 2012 03:39:01 +0000 (19:39 -0800)
committerH. Peter Anvin <hpa@linux.intel.com>
Sat, 17 Nov 2012 19:59:23 +0000 (11:59 -0800)
They are almost same except 64 bit need to handle after_bootmem case.

Add mm_internal.h to make that alloc_low_page() only to be accessible
from arch/x86/mm/init*.c

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Link: http://lkml.kernel.org/r/1353123563-3103-25-git-send-email-yinghai@kernel.org
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
arch/x86/mm/init.c
arch/x86/mm/init_32.c
arch/x86/mm/init_64.c
arch/x86/mm/mm_internal.h [new file with mode: 0644]

index 2393d0099e7f4afdb237ac9385168262840a725b..848189229b2dcf4cd79c909eab007f8dcbc1c652 100644 (file)
 #include <asm/proto.h>
 #include <asm/dma.h>           /* for MAX_DMA_PFN */
 
+#include "mm_internal.h"
+
 unsigned long __initdata pgt_buf_start;
 unsigned long __meminitdata pgt_buf_end;
 unsigned long __meminitdata pgt_buf_top;
 
+__ref void *alloc_low_page(void)
+{
+       unsigned long pfn;
+       void *adr;
+
+#ifdef CONFIG_X86_64
+       if (after_bootmem) {
+               adr = (void *)get_zeroed_page(GFP_ATOMIC | __GFP_NOTRACK);
+
+               return adr;
+       }
+#endif
+
+       if ((pgt_buf_end + 1) >= pgt_buf_top) {
+               unsigned long ret;
+               if (min_pfn_mapped >= max_pfn_mapped)
+                       panic("alloc_low_page: ran out of memory");
+               ret = memblock_find_in_range(min_pfn_mapped << PAGE_SHIFT,
+                                       max_pfn_mapped << PAGE_SHIFT,
+                                       PAGE_SIZE, PAGE_SIZE);
+               if (!ret)
+                       panic("alloc_low_page: can not alloc memory");
+               memblock_reserve(ret, PAGE_SIZE);
+               pfn = ret >> PAGE_SHIFT;
+       } else
+               pfn = pgt_buf_end++;
+
+       adr = __va(pfn * PAGE_SIZE);
+       clear_page(adr);
+       return adr;
+}
+
 /* need 4 4k for initial PMD_SIZE, 4k for 0-ISA_END_ADDRESS */
 #define INIT_PGT_BUF_SIZE      (5 * PAGE_SIZE)
 RESERVE_BRK(early_pgt_alloc, INIT_PGT_BUF_SIZE);
index 7bb11064a9e1f5374aa73d140f901cc2a2dad330..a7f2df1cdcfd972807a01ae016d6fd3ad695249b 100644 (file)
 #include <asm/page_types.h>
 #include <asm/init.h>
 
+#include "mm_internal.h"
+
 unsigned long highstart_pfn, highend_pfn;
 
 static noinline int do_test_wp_bit(void);
 
 bool __read_mostly __vmalloc_start_set = false;
 
-static __init void *alloc_low_page(void)
-{
-       unsigned long pfn;
-       void *adr;
-
-       if ((pgt_buf_end + 1) >= pgt_buf_top) {
-               unsigned long ret;
-               if (min_pfn_mapped >= max_pfn_mapped)
-                       panic("alloc_low_page: ran out of memory");
-               ret = memblock_find_in_range(min_pfn_mapped << PAGE_SHIFT,
-                                       max_pfn_mapped << PAGE_SHIFT,
-                                       PAGE_SIZE, PAGE_SIZE);
-               if (!ret)
-                       panic("alloc_low_page: can not alloc memory");
-               memblock_reserve(ret, PAGE_SIZE);
-               pfn = ret >> PAGE_SHIFT;
-       } else
-               pfn = pgt_buf_end++;
-
-       adr = __va(pfn * PAGE_SIZE);
-       clear_page(adr);
-       return adr;
-}
-
 /*
  * Creates a middle page table and puts a pointer to it in the
  * given global directory entry. This only returns the gd entry
index 19608203fa5d5b89259b57d05de4a6d460aa2e88..1d53defc99c9af8884a7b9102ddc63091be454ef 100644 (file)
@@ -54,6 +54,8 @@
 #include <asm/uv/uv.h>
 #include <asm/setup.h>
 
+#include "mm_internal.h"
+
 static int __init parse_direct_gbpages_off(char *arg)
 {
        direct_gbpages = 0;
@@ -314,36 +316,6 @@ void __init cleanup_highmap(void)
        }
 }
 
-static __ref void *alloc_low_page(void)
-{
-       unsigned long pfn;
-       void *adr;
-
-       if (after_bootmem) {
-               adr = (void *)get_zeroed_page(GFP_ATOMIC | __GFP_NOTRACK);
-
-               return adr;
-       }
-
-       if ((pgt_buf_end + 1) >= pgt_buf_top) {
-               unsigned long ret;
-               if (min_pfn_mapped >= max_pfn_mapped)
-                       panic("alloc_low_page: ran out of memory");
-               ret = memblock_find_in_range(min_pfn_mapped << PAGE_SHIFT,
-                                       max_pfn_mapped << PAGE_SHIFT,
-                                       PAGE_SIZE, PAGE_SIZE);
-               if (!ret)
-                       panic("alloc_low_page: can not alloc memory");
-               memblock_reserve(ret, PAGE_SIZE);
-               pfn = ret >> PAGE_SHIFT;
-       } else
-               pfn = pgt_buf_end++;
-
-       adr = __va(pfn * PAGE_SIZE);
-       clear_page(adr);
-       return adr;
-}
-
 static unsigned long __meminit
 phys_pte_init(pte_t *pte_page, unsigned long addr, unsigned long end,
              pgprot_t prot)
diff --git a/arch/x86/mm/mm_internal.h b/arch/x86/mm/mm_internal.h
new file mode 100644 (file)
index 0000000..b3f993a
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __X86_MM_INTERNAL_H
+#define __X86_MM_INTERNAL_H
+
+void *alloc_low_page(void);
+
+#endif /* __X86_MM_INTERNAL_H */