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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
a964e33c5d
commit
dc16ecf7fd
3 changed files with 12 additions and 4 deletions
|
@ -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;
|
||||||
|
|
||||||
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,
|
||||||
#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)
|
||||||
#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)
|
||||||
{
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue