lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ