From: Mel Gorman On (24/07/07 22:01), Andrew Morton didst pronounce: > On Tue, 13 Mar 2007 10:42:02 +0000 mel@skynet.ie (Mel Gorman) wrote: > > > There are problems in the use of SPARSEMEM and pageblock flags that causes > > problems on ia64. > > > > > > SuperH allmodconfig blew up: > > mm/sparse.c: In function `sparse_init': > mm/sparse.c:482: error: implicit declaration of function `sparse_early_usemap_alloc' > mm/sparse.c:482: warning: assignment makes pointer from integer without a cast > mm/sparse.c: In function `sparse_add_one_section': > mm/sparse.c:553: error: implicit declaration of function `__kmalloc_section_usemap' > mm/sparse.c:553: warning: assignment makes pointer from integer without a cast This error is due to a bad interaction between generic-virtual-memmap-support-for-sparsemem.patch and fix-corruption-of-memmap-on-ia64-sparsemem-when-mem_section-is-not-a-power-of-2.patch . Functions that are needed whether CONFIG_SPARSEMEM_VMEMMAP is set are not are depending on CONFIG_SPARSEMEM_VMEMMAP . This breaks on arch/sh for example where SPARSEMEM may be set but not NUMA. Signed-off-by: Mel Gorman Acked-by: Andy Whitcroft Signed-off-by: Andrew Morton --- mm/sparse.c | 58 +++++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff -puN mm/sparse.c~fix-corruption-of-memmap-on-ia64-sparsemem-when-mem_section-is-not-a-power-of-2-fix mm/sparse.c --- a/mm/sparse.c~fix-corruption-of-memmap-on-ia64-sparsemem-when-mem_section-is-not-a-power-of-2-fix +++ a/mm/sparse.c @@ -226,6 +226,35 @@ void *alloc_bootmem_high_node(pg_data_t return NULL; } +static unsigned long usemap_size(void) +{ + unsigned long size_bytes; + size_bytes = roundup(SECTION_BLOCKFLAGS_BITS, 8) / 8; + size_bytes = roundup(size_bytes, sizeof(unsigned long)); + return size_bytes; +} + +#ifdef CONFIG_MEMORY_HOTPLUG +static unsigned long *__kmalloc_section_usemap(void) +{ + return kmalloc(usemap_size(), GFP_KERNEL); +} +#endif /* CONFIG_MEMORY_HOTPLUG */ + +static unsigned long *sparse_early_usemap_alloc(unsigned long pnum) +{ + unsigned long *usemap; + struct mem_section *ms = __nr_to_section(pnum); + int nid = sparse_early_nid(ms); + + usemap = alloc_bootmem_node(NODE_DATA(nid), usemap_size()); + if (usemap) + return usemap; + + printk(KERN_WARNING "%s: allocation failed\n", __FUNCTION__); + return NULL; +} + #ifdef CONFIG_SPARSEMEM_VMEMMAP /* * Virtual Memory Map support @@ -260,35 +289,6 @@ void *alloc_bootmem_high_node(pg_data_t * require one PTE/TLB per PAGE_SIZE chunk of the virtual memory map. */ -static unsigned long usemap_size(void) -{ - unsigned long size_bytes; - size_bytes = roundup(SECTION_BLOCKFLAGS_BITS, 8) / 8; - size_bytes = roundup(size_bytes, sizeof(unsigned long)); - return size_bytes; -} - -#ifdef CONFIG_MEMORY_HOTPLUG -static unsigned long *__kmalloc_section_usemap(void) -{ - return kmalloc(usemap_size(), GFP_KERNEL); -} -#endif /* CONFIG_MEMORY_HOTPLUG */ - -static unsigned long *sparse_early_usemap_alloc(unsigned long pnum) -{ - unsigned long *usemap; - struct mem_section *ms = __nr_to_section(pnum); - int nid = sparse_early_nid(ms); - - usemap = alloc_bootmem_node(NODE_DATA(nid), usemap_size()); - if (usemap) - return usemap; - - printk(KERN_WARNING "%s: allocation failed\n", __FUNCTION__); - return NULL; -} - /* * Allocate a block of memory to be used to back the virtual memory map * or to back the page tables that are used to create the mapping. _