Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ia64: don't alias VMALLOC_END to vmalloc_end

If CONFIG_VIRTUAL_MEM_MAP is enabled, ia64 defines macro VMALLOC_END
as unsigned long variable vmalloc_end which is adjusted to prepare
room for vmemmap. This becomes probnlematic if a local variables
vmalloc_end is defined in some function (not very unlikely) and
VMALLOC_END is used in the function - the function thinks its
referencing the global VMALLOC_END value but would be referencing its
own local vmalloc_end variable.

There's no reason VMALLOC_END should be a macro. Just define it as an
unsigned long variable if CONFIG_VIRTUAL_MEM_MAP is set to avoid nasty
surprises.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Tony Luck <tony.luck@intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: linux-ia64 <linux-ia64@vger.kernel.org>
Cc: Christoph Lameter <cl@linux-foundation.org>

Tejun Heo 126b3fcd 0efe5e32

+8 -9
+1 -1
arch/ia64/include/asm/meminit.h
··· 61 61 62 62 #ifdef CONFIG_VIRTUAL_MEM_MAP 63 63 # define LARGE_GAP 0x40000000 /* Use virtual mem map if hole is > than this */ 64 - extern unsigned long vmalloc_end; 64 + extern unsigned long VMALLOC_END; 65 65 extern struct page *vmem_map; 66 66 extern int find_largest_hole(u64 start, u64 end, void *arg); 67 67 extern int create_mem_map_page_table(u64 start, u64 end, void *arg);
+1 -2
arch/ia64/include/asm/pgtable.h
··· 228 228 #define VMALLOC_START (RGN_BASE(RGN_GATE) + 0x200000000UL) 229 229 #ifdef CONFIG_VIRTUAL_MEM_MAP 230 230 # define VMALLOC_END_INIT (RGN_BASE(RGN_GATE) + (1UL << (4*PAGE_SHIFT - 9))) 231 - # define VMALLOC_END vmalloc_end 232 - extern unsigned long vmalloc_end; 231 + extern unsigned long VMALLOC_END; 233 232 #else 234 233 #if defined(CONFIG_SPARSEMEM) && defined(CONFIG_SPARSEMEM_VMEMMAP) 235 234 /* SPARSEMEM_VMEMMAP uses half of vmalloc... */
+2 -2
arch/ia64/mm/contig.c
··· 270 270 271 271 map_size = PAGE_ALIGN(ALIGN(max_low_pfn, MAX_ORDER_NR_PAGES) * 272 272 sizeof(struct page)); 273 - vmalloc_end -= map_size; 274 - vmem_map = (struct page *) vmalloc_end; 273 + VMALLOC_END -= map_size; 274 + vmem_map = (struct page *) VMALLOC_END; 275 275 efi_memmap_walk(create_mem_map_page_table, NULL); 276 276 277 277 /*
+2 -2
arch/ia64/mm/discontig.c
··· 666 666 sparse_init(); 667 667 668 668 #ifdef CONFIG_VIRTUAL_MEM_MAP 669 - vmalloc_end -= PAGE_ALIGN(ALIGN(max_low_pfn, MAX_ORDER_NR_PAGES) * 669 + VMALLOC_END -= PAGE_ALIGN(ALIGN(max_low_pfn, MAX_ORDER_NR_PAGES) * 670 670 sizeof(struct page)); 671 - vmem_map = (struct page *) vmalloc_end; 671 + vmem_map = (struct page *) VMALLOC_END; 672 672 efi_memmap_walk(create_mem_map_page_table, NULL); 673 673 printk("Virtual mem_map starts at 0x%p\n", vmem_map); 674 674 #endif
+2 -2
arch/ia64/mm/init.c
··· 44 44 unsigned long MAX_DMA_ADDRESS = PAGE_OFFSET + 0x100000000UL; 45 45 46 46 #ifdef CONFIG_VIRTUAL_MEM_MAP 47 - unsigned long vmalloc_end = VMALLOC_END_INIT; 48 - EXPORT_SYMBOL(vmalloc_end); 47 + unsigned long VMALLOC_END = VMALLOC_END_INIT; 48 + EXPORT_SYMBOL(VMALLOC_END); 49 49 struct page *vmem_map; 50 50 EXPORT_SYMBOL(vmem_map); 51 51 #endif