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

um: delete unnecessary bootmem struct page array

1) uml kernel bootmem managed through bootmem_data->node_bootmem_map,
not the struct page array, so the array is unnecessary.

2) the bootmem struct page array has been pointed by a *local* pointer,
struct page *map, in init_maps function. The array can be accessed only
in init_maps's scope. As a result, uml kernel wastes about 1% of total
memory.

Signed-off-by: Honggang Li <enjoymindful@gmail.com>
Signed-off-by: Richard Weinberger <richard@nod.at>

authored by

Honggang Li and committed by
Richard Weinberger
9e6a57d2 67131230

+8 -33
+1 -1
arch/um/include/shared/mem_user.h
··· 49 49 extern int init_mem_user(void); 50 50 extern void setup_memory(void *entry); 51 51 extern unsigned long find_iomem(char *driver, unsigned long *len_out); 52 - extern int init_maps(unsigned long physmem, unsigned long iomem, 52 + extern void mem_total_pages(unsigned long physmem, unsigned long iomem, 53 53 unsigned long highmem); 54 54 extern unsigned long get_vm(unsigned long len); 55 55 extern void setup_physmem(unsigned long start, unsigned long usable,
+6 -26
arch/um/kernel/physmem.c
··· 22 22 23 23 extern unsigned long long physmem_size; 24 24 25 - int __init init_maps(unsigned long physmem, unsigned long iomem, 25 + void __init mem_total_pages(unsigned long physmem, unsigned long iomem, 26 26 unsigned long highmem) 27 27 { 28 - struct page *p, *map; 29 - unsigned long phys_len, phys_pages, highmem_len, highmem_pages; 30 - unsigned long iomem_len, iomem_pages, total_len, total_pages; 31 - int i; 28 + unsigned long phys_pages, highmem_pages; 29 + unsigned long iomem_pages, total_pages; 32 30 33 - phys_pages = physmem >> PAGE_SHIFT; 34 - phys_len = phys_pages * sizeof(struct page); 35 - 36 - iomem_pages = iomem >> PAGE_SHIFT; 37 - iomem_len = iomem_pages * sizeof(struct page); 38 - 31 + phys_pages = physmem >> PAGE_SHIFT; 32 + iomem_pages = iomem >> PAGE_SHIFT; 39 33 highmem_pages = highmem >> PAGE_SHIFT; 40 - highmem_len = highmem_pages * sizeof(struct page); 41 34 42 - total_pages = phys_pages + iomem_pages + highmem_pages; 43 - total_len = phys_len + iomem_len + highmem_len; 44 - 45 - map = alloc_bootmem_low_pages(total_len); 46 - if (map == NULL) 47 - return -ENOMEM; 48 - 49 - for (i = 0; i < total_pages; i++) { 50 - p = &map[i]; 51 - memset(p, 0, sizeof(struct page)); 52 - SetPageReserved(p); 53 - INIT_LIST_HEAD(&p->lru); 54 - } 35 + total_pages = phys_pages + iomem_pages + highmem_pages; 55 36 56 37 max_mapnr = total_pages; 57 - return 0; 58 38 } 59 39 60 40 void map_memory(unsigned long virt, unsigned long phys, unsigned long len,
+1 -6
arch/um/kernel/um_arch.c
··· 348 348 start_vm = VMALLOC_START; 349 349 350 350 setup_physmem(uml_physmem, uml_reserved, physmem_size, highmem); 351 - if (init_maps(physmem_size, iomem_size, highmem)) { 352 - printf("Failed to allocate mem_map for %Lu bytes of physical " 353 - "memory and %Lu bytes of highmem\n", physmem_size, 354 - highmem); 355 - exit(1); 356 - } 351 + mem_total_pages(physmem_size, iomem_size, highmem); 357 352 358 353 virtmem_size = physmem_size; 359 354 stack = (unsigned long) argv;