forked from mirrors/linux
		
	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…
	
		Reference in a new issue