[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20140616081238.GA1840@name>
Date: Mon, 16 Jun 2014 16:12:38 +0800
From: Real Name <enjoymindful@...il.com>
To: Richard Weinberger <richard@....at>
Cc: user-mode-linux-devel@...ts.sourceforge.net,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2] delete unnecessary bootmem struct page array
On Mon, Jun 16, 2014 at 08:50:33AM +0200, Richard Weinberger wrote:
>
>
> Am 16.06.2014 05:28, schrieb Real Name:
> > 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 <enjoymindful@...il.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@...e linux-next]$ make ARCH=um defconfig
> >>> [real@...e linux-next]$ make ARCH=um linux
> >>> [real@...e 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@...e linux-next]$ ./linux ubda=/home/real/linux-next/Fedora20-AMD64-root_fs mem=256m && sync && echo 1
> >>> [real@...e 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?
>
> https://git.kernel.org/cgit/linux/kernel/git/tglx/history.git
richard, geert, and paul
thanks all of you for the git-pre info.
>
> > 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.
> >
>
> And if you remove it here too UML still works?
yes, it works. I removed the code related struct page array in init_maps.
Please check the attachments.
[root@...9 root]# /root/linux-2.4.20/linux ubda=/root/uml/root_fs.rh-7.2-server.pristine.20020312 mem=256m 2>&1 | tee /tmp/log.txt
thanks
>
> Thanks,
> //richard
>
> > 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(-)
> >>>
View attachment "linux-2.4.20_uml_init_maps.patch" of type "text/x-diff" (628 bytes)
View attachment "log.txt" of type "text/plain" (7113 bytes)
View attachment "init_maps.s" of type "text/plain" (1581 bytes)
View attachment "bash_history_tail.txt" of type "text/plain" (2634 bytes)
Powered by blists - more mailing lists