x86-32: use specific __vmalloc_start_set flag in __virt_addr_valid
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Thu, 5 Mar 2009 00:10:44 +0000 (16:10 -0800)
committerIngo Molnar <mingo@elte.hu>
Thu, 5 Mar 2009 13:53:10 +0000 (14:53 +0100)
Rather than relying on the ever-unreliable system_state,
add a specific __vmalloc_start_set flag to indicate whether
the vmalloc area has meaningful boundaries yet, and use that
in x86-32's __phys_addr and __virt_addr_valid.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/include/asm/pgtable_32_types.h
arch/x86/mm/init_32.c
arch/x86/mm/ioremap.c

index bd8df3b2fe04fc61fc0912569ebbf498969a028f..2733fad45f989bfd5a775c99e5decb35cfe8014a 100644 (file)
  * area for the same reason. ;)
  */
 #define VMALLOC_OFFSET (8 * 1024 * 1024)
+
+#ifndef __ASSEMBLER__
+extern bool __vmalloc_start_set; /* set once high_memory is set */
+#endif
+
 #define VMALLOC_START  ((unsigned long)high_memory + VMALLOC_OFFSET)
 #ifdef CONFIG_X86_PAE
 #define LAST_PKMAP 512
index 5e5126e0d544b34cc31457a41c0cdda24bd8bc48..d57dfffb0213bfc2c44ba3c2fab405e8e894f200 100644 (file)
@@ -59,6 +59,8 @@ 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 = e820_table_end++;
@@ -757,6 +759,8 @@ void __init initmem_init(unsigned long start_pfn,
 #ifdef CONFIG_FLATMEM
        max_mapnr = num_physpages;
 #endif
+       __vmalloc_start_set = true;
+
        printk(KERN_NOTICE "%ldMB LOWMEM available.\n",
                        pages_to_mb(max_low_pfn));
 
index 433f7bd4648af4206fbc4afb0b2fd6b6dab59b6e..a23ca5b5bf240cd51d7f12882b063e419c7ec054 100644 (file)
@@ -76,10 +76,9 @@ static inline int phys_addr_valid(unsigned long addr)
 #ifdef CONFIG_DEBUG_VIRTUAL
 unsigned long __phys_addr(unsigned long x)
 {
-       /* VMALLOC_* aren't constants; not available at the boot time */
+       /* VMALLOC_* aren't constants  */
        VIRTUAL_BUG_ON(x < PAGE_OFFSET);
-       VIRTUAL_BUG_ON(system_state != SYSTEM_BOOTING &&
-               is_vmalloc_addr((void *) x));
+       VIRTUAL_BUG_ON(__vmalloc_start_set && is_vmalloc_addr((void *) x));
        return x - PAGE_OFFSET;
 }
 EXPORT_SYMBOL(__phys_addr);
@@ -89,7 +88,7 @@ bool __virt_addr_valid(unsigned long x)
 {
        if (x < PAGE_OFFSET)
                return false;
-       if (system_state != SYSTEM_BOOTING && is_vmalloc_addr((void *) x))
+       if (__vmalloc_start_set && is_vmalloc_addr((void *) x))
                return false;
        return pfn_valid((x - PAGE_OFFSET) >> PAGE_SHIFT);
 }