On Sat, Jun 14, 2014 at 11:44:04AM +0200, Richard Weinberger wrote: > Hi! > > Am 03.06.2014 07:30, schrieb Real Name: > > From: Honggang Li <enjoymind...@gmail.com> > > > > The patch based on linux-next-2014-06-02. > > > > The old init_maps function does two things: > > 1) allocates and initializes one struct page array for bootmem > > 2) count the number of total pages > > > > After removed the source code related to the unnecessary array, the name > > 'init_maps' is some kind of improper named, as it just count the number of > > total page numbers. So, I renamed the function as 'mem_total_pages'. > > > > I tested the patch through repeat reboot the uml kernel many times. > > [real@name linux-next]$ make ARCH=um defconfig > > [real@name linux-next]$ make ARCH=um linux > > [real@name linux-next]$ file linux > > linux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically > > linked (uses shared libs), for GNU/Linux 2.6.32, not stripped > > [real@name linux-next]$ ./linux > > ubda=/home/real/linux-next/Fedora20-AMD64-root_fs mem=256m && sync && echo 1 > > [real@name linux-next]$ ./linux > > ubda=/home/real/linux-next/Fedora20-AMD64-root_fs mem=256m && sync && echo 2 > > (repeat reboot the uml kernel many times..) > > Can you please include in the changelog the commit sha1 which made the old > init_maps() obsolete? > I had a look at the pre-git linux tree, looks like init_maps() wasn't touched > for more than 10 years.
hi, richard what is the pre-git linux tree? I searched it with google, but failed. The v2.6.12 kernel is the oldest one available from the linux-next git tree. And it has duplicated struct page arrays. So, any suggestion how to find the commit you wanted? linux-2.4.20 + uml-patch-2.4.20-8 works on *old* redhat-9 virtual machine. And it seems has duplicated struct page array too. The first struct page array ------------------------ linux-2.4.20/arch/um/kernel/physmem.c 157 int init_maps(unsigned long len) 158 { 159 struct page *p, *map; 160 int i, n; 161 162 n = len >> PAGE_SHIFT; 163 len = n * sizeof(struct page); 164 165 if(kmalloc_ok){ 166 map = kmalloc(len, GFP_KERNEL); 167 if(map == NULL) map = vmalloc(len); 168 } 169 else map = alloc_bootmem_low_pages(len); 170 171 if(map == NULL) 172 return(-ENOMEM); 173 174 for(i = 0; i < n; i++){ 175 p = &map[i]; 176 set_page_count(p, 0); 177 SetPageReserved(p); 178 INIT_LIST_HEAD(&p->list); 179 } 180 181 mem_map = map; 182 max_mapnr = n; 183 return(0); 184 } The second struct page array ----------------------- mm/memory.c 73 mem_map_t * mem_map; // global define mm/page_alloc.c 839 void __init free_area_init(unsigned long *zones_size) 840 { 841 free_area_init_core(0, &contig_page_data, &mem_map, zones_size, 0, 0, 0); 842 } -------- mm/page_alloc.c 685 void __init free_area_init_core(int nid, pg_data_t *pgdat, struct page **gmap, 686 unsigned long *zones_size, unsigned long zone_start_paddr, 687 unsigned long *zholes_size, struct page *lmem_map) 688 { ........ 716 map_size = (totalpages + 1)*sizeof(struct page); 717 if (lmem_map == (struct page *)0) { 718 lmem_map = (struct page *) alloc_bootmem_node(pgdat, map_size); 719 lmem_map = (struct page *)(PAGE_OFFSET + 720 MAP_ALIGN((unsigned long)lmem_map - PAGE_OFFSET)); 721 } 722 *gmap = pgdat->node_mem_map = lmem_map; > > Thanks, > //richard > > > Honggang Li (1): > > delete unnecessary bootmem struct page array > > > > arch/um/include/shared/mem_user.h | 2 +- > > arch/um/kernel/physmem.c | 32 ++++++-------------------------- > > arch/um/kernel/um_arch.c | 7 +------ > > 3 files changed, 8 insertions(+), 33 deletions(-) > > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/