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

sh: sparsemem support.

This implements basic sparsemem support for SH. Presently this only
uses static sparsemem, and we still permit explicit selection of
flatmem. Those boards that want sparsemem can select it as usual.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>

authored by

Paul Mundt and committed by
Paul Mundt
dfbb9042 5900711a

+38 -25
+6 -2
arch/sh/kernel/setup.c
··· 128 128 bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn, 129 129 min_low_pfn, max_low_pfn); 130 130 131 + add_active_range(0, min_low_pfn, max_low_pfn); 131 132 register_bootmem_low_pages(); 132 133 133 134 node_set_online(0); ··· 193 192 */ 194 193 start_pfn = PFN_UP(__pa(_end)); 195 194 setup_bootmem_allocator(start_pfn); 195 + sparse_memory_present_with_active_regions(0); 196 196 } 197 197 #else 198 198 extern void __init setup_memory(void); ··· 252 250 min_low_pfn = __MEMORY_START >> PAGE_SHIFT; 253 251 254 252 nodes_clear(node_online_map); 253 + 254 + /* Setup bootmem with available RAM */ 255 255 setup_memory(); 256 - paging_init(); 257 256 sparse_init(); 258 257 259 258 #ifdef CONFIG_DUMMY_CONSOLE ··· 264 261 /* Perform the machine specific initialisation */ 265 262 if (likely(sh_mv.mv_setup)) 266 263 sh_mv.mv_setup(cmdline_p); 267 - } 268 264 265 + paging_init(); 266 + } 269 267 270 268 static const char *cpu_name[] = { 271 269 [CPU_SH7206] = "SH7206", [CPU_SH7619] = "SH7619",
+10
arch/sh/mm/Kconfig
··· 300 300 config ARCH_FLATMEM_ENABLE 301 301 def_bool y 302 302 303 + config ARCH_SPARSEMEM_ENABLE 304 + def_bool y 305 + select SPARSEMEM_STATIC 306 + 307 + config ARCH_SPARSEMEM_DEFAULT 308 + def_bool y 309 + 303 310 config MAX_ACTIVE_REGIONS 304 311 int 305 312 default "1" 306 313 307 314 config ARCH_POPULATES_NODE_MAP 315 + def_bool y 316 + 317 + config ARCH_SELECT_MEMORY_MODEL 308 318 def_bool y 309 319 310 320 choice
+6 -23
arch/sh/mm/init.c
··· 36 36 show_free_areas(); 37 37 38 38 for_each_online_pgdat(pgdat) { 39 - struct page *page, *end; 40 - unsigned long flags; 39 + unsigned long flags, i; 41 40 42 41 pgdat_resize_lock(pgdat, &flags); 43 - page = pgdat->node_mem_map; 44 - end = page + pgdat->node_spanned_pages; 45 - 46 - do { 42 + for (i = 0; i < pgdat->node_spanned_pages; i++) { 43 + struct page *page = pgdat_page_nr(pgdat, i); 47 44 total++; 48 45 if (PageReserved(page)) 49 46 reserved++; ··· 52 55 free++; 53 56 else 54 57 shared += page_count(page) - 1; 55 - page++; 56 - } while (page < end); 57 - 58 + } 58 59 pgdat_resize_unlock(pgdat, &flags); 59 60 } 60 61 ··· 164 169 low = pgdat->bdata->node_low_pfn; 165 170 166 171 max_zone_pfns[ZONE_NORMAL] = low; 167 - add_active_range(nid, start_pfn, low); 168 172 169 173 printk("Node %u: start_pfn = 0x%lx, low = 0x%lx\n", 170 174 nid, start_pfn, low); 171 175 172 176 free_area_init_nodes(max_zone_pfns); 173 - 174 - printk("Node %u: mem_map starts at %p\n", 175 - pgdat->node_id, pgdat->node_mem_map); 176 177 } 177 178 } 178 179 ··· 176 185 177 186 void __init mem_init(void) 178 187 { 179 - int codesize, reservedpages, datasize, initsize; 188 + int codesize, datasize, initsize; 180 189 int nid; 181 - 182 - reservedpages = 0; 183 190 184 191 for_each_online_node(nid) { 185 192 pg_data_t *pgdat = NODE_DATA(nid); 186 193 unsigned long node_pages = 0; 187 194 void *node_high_memory; 188 - int i; 189 195 190 196 num_physpages += pgdat->node_present_pages; 191 197 ··· 190 202 node_pages = free_all_bootmem_node(pgdat); 191 203 192 204 totalram_pages += node_pages; 193 - 194 - for (i = 0; i < node_pages; i++) 195 - if (PageReserved(pgdat->node_mem_map + i)) 196 - reservedpages++; 197 205 198 206 node_high_memory = (void *)((pgdat->node_start_pfn + 199 207 pgdat->node_spanned_pages) << ··· 223 239 VMALLOC_END - VMALLOC_START); 224 240 225 241 printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, " 226 - "%dk reserved, %dk data, %dk init)\n", 242 + "%dk data, %dk init)\n", 227 243 (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), 228 244 totalram_pages << (PAGE_SHIFT-10), 229 245 codesize >> 10, 230 - reservedpages << (PAGE_SHIFT-10), 231 246 datasize >> 10, 232 247 initsize >> 10); 233 248
+16
include/asm-sh/sparsemem.h
··· 1 + #ifndef __ASM_SH_SPARSEMEM_H 2 + #define __ASM_SH_SPARSEMEM_H 3 + 4 + #ifdef __KERNEL__ 5 + /* 6 + * SECTION_SIZE_BITS 2^N: how big each section will be 7 + * MAX_PHYSADDR_BITS 2^N: how much physical address space we have 8 + * MAX_PHYSMEM_BITS 2^N: how much memory we can have in that space 9 + */ 10 + #define SECTION_SIZE_BITS 26 11 + #define MAX_PHYSADDR_BITS 32 12 + #define MAX_PHYSMEM_BITS 32 13 + 14 + #endif 15 + 16 + #endif /* __ASM_SH_SPARSEMEM_H */