Re: [PATCH v2] delete unnecessary bootmem struct page array

Real Name
2014-07-17T23:10:47Z

On Mon, Jun 16, 2014 at 06:30:36PM +0800, Real Name wrote:
> On Mon, Jun 16, 2014 at 11:15:23AM +0200, Geert Uytterhoeven wrote:
> > On Mon, Jun 16, 2014 at 10:28 AM, Real Name <enjoymindful@gmail.com> wrote:
> > >> > >> Can you please include in the changelog the commit sha1 which made the old init_maps() obsolete?
>
> hi,
>
> The commit sha1 had been included as required. Please review the attached patch.
> I only update the changlog of the patch.
>

hi, Rechard
ping?

> thanks
> > >
> > > I think we need find out which commit deleted the line "mem_map = map;" in init_maps function.
> >
> >
> > v2.6.12-rc1
> >
> > commit 5678d7fc97ac75f7401ce77897773cc0bb3afee5
>
> Geert, thank you.
>
> > Author: Dave Hansen <haveblue@us.ibm.com>
> > Date: Sun Mar 13 00:22:56 2005 -0800
> >
> > [PATCH] no arch-specific mem_map init
> >

> From 29e5e83f8f3988ea1396d61b4d5764e7904f82c5 Mon Sep 17 00:00:00 2001
> From: Honggang Li <enjoymindful@gmail.com>
> Date: Mon, 16 Jun 2014 18:05:47 +0800
> Subject: [PATCH] UML 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.
>
> 3) commit 5678d7fc97ac75f7401ce77897773cc0bb3afee5 obsoleted
> the init_maps function.
>
> Signed-off-by: Honggang Li <enjoymindful@gmail.com>
> ---
> 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(-)
>
> diff --git a/arch/um/include/shared/mem_user.h b/arch/um/include/shared/mem_user.h
> index 46384ac..cb84414 100644
> --- a/arch/um/include/shared/mem_user.h
> +++ b/arch/um/include/shared/mem_user.h
> @@ -49,7 +49,7 @@ extern int iomem_size;
> extern int init_mem_user(void);
> extern void setup_memory(void *entry);
> extern unsigned long find_iomem(char *driver, unsigned long *len_out);
> -extern int init_maps(unsigned long physmem, unsigned long iomem,
> +extern void mem_total_pages(unsigned long physmem, unsigned long iomem,
> unsigned long highmem);
> extern unsigned long get_vm(unsigned long len);
> extern void setup_physmem(unsigned long start, unsigned long usable,
> diff --git a/arch/um/kernel/physmem.c b/arch/um/kernel/physmem.c
> index 30fdd5d..549ecf3 100644
> --- a/arch/um/kernel/physmem.c
> +++ b/arch/um/kernel/physmem.c
> @@ -22,39 +22,19 @@ EXPORT_SYMBOL(high_physmem);
>
> extern unsigned long long physmem_size;
>
> -int __init init_maps(unsigned long physmem, unsigned long iomem,
> +void __init mem_total_pages(unsigned long physmem, unsigned long iomem,
> unsigned long highmem)
> {
> - struct page *p, *map;
> - unsigned long phys_len, phys_pages, highmem_len, highmem_pages;
> - unsigned long iomem_len, iomem_pages, total_len, total_pages;
> - int i;
> -
> - phys_pages = physmem >> PAGE_SHIFT;
> - phys_len = phys_pages * sizeof(struct page);
> -
> - iomem_pages = iomem >> PAGE_SHIFT;
> - iomem_len = iomem_pages * sizeof(struct page);
> + unsigned long phys_pages, highmem_pages;
> + unsigned long iomem_pages, total_pages;
>
> + phys_pages = physmem >> PAGE_SHIFT;
> + iomem_pages = iomem >> PAGE_SHIFT;
> highmem_pages = highmem >> PAGE_SHIFT;
> - highmem_len = highmem_pages * sizeof(struct page);
> -
> - total_pages = phys_pages + iomem_pages + highmem_pages;
> - total_len = phys_len + iomem_len + highmem_len;
>
> - map = alloc_bootmem_low_pages(total_len);
> - if (map == NULL)
> - return -ENOMEM;
> -
> - for (i = 0; i < total_pages; i++) {
> - p = &map[i];
> - memset(p, 0, sizeof(struct page));
> - SetPageReserved(p);
> - INIT_LIST_HEAD(&p->lru);
> - }
> + total_pages = phys_pages + iomem_pages + highmem_pages;
>
> max_mapnr = total_pages;
> - return 0;
> }
>
> void map_memory(unsigned long virt, unsigned long phys, unsigned long len,
> diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c
> index 6043c76..dbd5bda 100644
> --- a/arch/um/kernel/um_arch.c
> +++ b/arch/um/kernel/um_arch.c
> @@ -338,12 +338,7 @@ int __init linux_main(int argc, char **argv)
> start_vm = VMALLOC_START;
>
> setup_physmem(uml_physmem, uml_reserved, physmem_size, highmem);
> - if (init_maps(physmem_size, iomem_size, highmem)) {
> - printf("Failed to allocate mem_map for %Lu bytes of physical "
> - "memory and %Lu bytes of highmem\n", physmem_size,
> - highmem);
> - exit(1);
> - }
> + mem_total_pages(physmem_size, iomem_size, highmem);
>
> virtmem_size = physmem_size;
> stack = (unsigned long) argv;
> --
> 1.8.3.1
>