Commit dc16ecf7 authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Ingo Molnar

x86-32: use specific __vmalloc_start_set flag in __virt_addr_valid

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: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent a964e33c
...@@ -25,6 +25,11 @@ ...@@ -25,6 +25,11 @@
* area for the same reason. ;) * area for the same reason. ;)
*/ */
#define VMALLOC_OFFSET (8 * 1024 * 1024) #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) #define VMALLOC_START ((unsigned long)high_memory + VMALLOC_OFFSET)
#ifdef CONFIG_X86_PAE #ifdef CONFIG_X86_PAE
#define LAST_PKMAP 512 #define LAST_PKMAP 512
......
...@@ -59,6 +59,8 @@ unsigned long highstart_pfn, highend_pfn; ...@@ -59,6 +59,8 @@ unsigned long highstart_pfn, highend_pfn;
static noinline int do_test_wp_bit(void); static noinline int do_test_wp_bit(void);
bool __read_mostly __vmalloc_start_set = false;
static __init void *alloc_low_page(void) static __init void *alloc_low_page(void)
{ {
unsigned long pfn = e820_table_end++; unsigned long pfn = e820_table_end++;
...@@ -757,6 +759,8 @@ void __init initmem_init(unsigned long start_pfn, ...@@ -757,6 +759,8 @@ void __init initmem_init(unsigned long start_pfn,
#ifdef CONFIG_FLATMEM #ifdef CONFIG_FLATMEM
max_mapnr = num_physpages; max_mapnr = num_physpages;
#endif #endif
__vmalloc_start_set = true;
printk(KERN_NOTICE "%ldMB LOWMEM available.\n", printk(KERN_NOTICE "%ldMB LOWMEM available.\n",
pages_to_mb(max_low_pfn)); pages_to_mb(max_low_pfn));
......
...@@ -76,10 +76,9 @@ static inline int phys_addr_valid(unsigned long addr) ...@@ -76,10 +76,9 @@ static inline int phys_addr_valid(unsigned long addr)
#ifdef CONFIG_DEBUG_VIRTUAL #ifdef CONFIG_DEBUG_VIRTUAL
unsigned long __phys_addr(unsigned long x) 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(x < PAGE_OFFSET);
VIRTUAL_BUG_ON(system_state != SYSTEM_BOOTING && VIRTUAL_BUG_ON(__vmalloc_start_set && is_vmalloc_addr((void *) x));
is_vmalloc_addr((void *) x));
return x - PAGE_OFFSET; return x - PAGE_OFFSET;
} }
EXPORT_SYMBOL(__phys_addr); EXPORT_SYMBOL(__phys_addr);
...@@ -89,7 +88,7 @@ bool __virt_addr_valid(unsigned long x) ...@@ -89,7 +88,7 @@ bool __virt_addr_valid(unsigned long x)
{ {
if (x < PAGE_OFFSET) if (x < PAGE_OFFSET)
return false; return false;
if (system_state != SYSTEM_BOOTING && is_vmalloc_addr((void *) x)) if (__vmalloc_start_set && is_vmalloc_addr((void *) x))
return false; return false;
return pfn_valid((x - PAGE_OFFSET) >> PAGE_SHIFT); return pfn_valid((x - PAGE_OFFSET) >> PAGE_SHIFT);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment