From: Dave Hansen <haveblue@us.ibm.com>
To: linux-ia64@vger.kernel.org
Subject: need ia64 testers: no per-arch mem_map init
Date: Sat, 05 Mar 2005 00:11:30 +0000 [thread overview]
Message-ID: <1109981490.1976.17.camel@localhost> (raw)
[-- Attachment #1: Type: text/plain, Size: 767 bytes --]
I've sent this to some of you ia64 folks before, but this has changed
slightly. I'd like to send this to Andrew Morton for inclusion in -mm
in the next couple of days if everything goes OK. Bob Picco noticed
that it didn't work because of an oversight of mine with how vmem_map
works, but I think that's fixed now.
In any case, this simplifies how all architectures set up the global
mem_map variable, and will help simplify interactions with the memory
hotplug code as well.
However, ia64 has perhaps the most complex mem_map[ initialization, and
a diverse set of configurations. I'd much prefer to fix any corner
cases now, than try to fix it up after it's in -mm. I'd appreciate all
of the ia64 testing I can get, especially when CONFIG_NUMA is on.
-- Dave
[-- Attachment #2: A6-no_arch_mem_map_init.patch --]
[-- Type: text/x-patch, Size: 10577 bytes --]
So, this patch started out with me trying to keep from passing
contiguous, node-specific mem_map into free_area_init_node() and
cousins. Instead, I relied on some calls to pfn_to_page().
This works fine and dandy when all you need is the pgdat->node_mem_map
to do pfn_to_page(). However, the non-NUMA/DISCONTIG architectures use
the real, global mem_map[] instead of a node_mem_map in the
pfn_to_page() calculation. So, I ended up effectively trying to
initialize mem_map from itself, when it was NULL. That was bad, and
caused some very pretty colors on someone's screen when he tested it.
So, I had to make sure to initialize the global mem_map[] before calling
into free_area_init_node(). Then, I realized how many architectures do
this on their own, and have comments like this:
/* XXX: MRB-remove - this doesn't seem sane, should this be done somewhere else ?*/
mem_map = NODE_DATA(0)->node_mem_map;
The following patch does what my first one did (don't pass mem_map into
the init functions), incorporates Jesse Barnes' ia64 fixes on top of
that, and gets rid of all but one of the global mem_map initializations
(parisc is weird). It also magically removes more code than it adds.
It could be smaller, but I shamelessly added some comments.
Boot-tested on ppc64, i386 (NUMAQ, plain SMP, laptop), UML (i386).
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
---
memhotplug-dave/arch/arm/mm/init.c | 4 ----
memhotplug-dave/arch/arm26/mm/init.c | 2 --
memhotplug-dave/arch/cris/arch-v10/mm/init.c | 1 -
memhotplug-dave/arch/ia64/mm/contig.c | 2 +-
memhotplug-dave/arch/m32r/mm/init.c | 2 --
memhotplug-dave/arch/ppc64/mm/init.c | 1 -
memhotplug-dave/arch/sh/mm/init.c | 2 --
memhotplug-dave/arch/sh64/mm/init.c | 3 ---
memhotplug-dave/arch/sparc/mm/srmmu.c | 1 -
memhotplug-dave/arch/sparc/mm/sun4c.c | 1 -
memhotplug-dave/arch/sparc64/mm/init.c | 1 -
memhotplug-dave/arch/um/kernel/physmem.c | 1 -
memhotplug-dave/arch/v850/kernel/setup.c | 1 -
memhotplug-dave/mm/page_alloc.c | 22 ++++++++++++++++------
14 files changed, 17 insertions(+), 27 deletions(-)
diff -puN arch/arm/mm/init.c~A6-no_arch_mem_map_init arch/arm/mm/init.c
--- memhotplug/arch/arm/mm/init.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/arch/arm/mm/init.c 2005-03-04 09:16:41.000000000 -0800
@@ -501,10 +501,6 @@ void __init paging_init(struct meminfo *
bdata->node_boot_start >> PAGE_SHIFT, zhole_size);
}
-#ifndef CONFIG_DISCONTIGMEM
- mem_map = contig_page_data.node_mem_map;
-#endif
-
/*
* finish off the bad pages once
* the mem_map is initialised
diff -puN arch/arm26/mm/init.c~A6-no_arch_mem_map_init arch/arm26/mm/init.c
--- memhotplug/arch/arm26/mm/init.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/arch/arm26/mm/init.c 2005-03-04 09:16:41.000000000 -0800
@@ -309,8 +309,6 @@ void __init paging_init(struct meminfo *
free_area_init_node(0, pgdat, zone_size,
bdata->node_boot_start >> PAGE_SHIFT, zhole_size);
- mem_map = NODE_DATA(0)->node_mem_map;
-
/*
* finish off the bad pages once
* the mem_map is initialised
diff -puN arch/cris/arch-v10/mm/init.c~A6-no_arch_mem_map_init arch/cris/arch-v10/mm/init.c
--- memhotplug/arch/cris/arch-v10/mm/init.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/arch/cris/arch-v10/mm/init.c 2005-03-04 09:16:41.000000000 -0800
@@ -184,7 +184,6 @@ paging_init(void)
*/
free_area_init_node(0, &contig_page_data, zones_size, PAGE_OFFSET >> PAGE_SHIFT, 0);
- mem_map = contig_page_data.node_mem_map;
}
/* Initialize remaps of some I/O-ports. It is important that this
diff -puN arch/i386/mm/discontig.c~A6-no_arch_mem_map_init arch/i386/mm/discontig.c
diff -puN arch/ia64/mm/contig.c~A6-no_arch_mem_map_init arch/ia64/mm/contig.c
--- memhotplug/arch/ia64/mm/contig.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/arch/ia64/mm/contig.c 2005-03-04 09:16:41.000000000 -0800
@@ -280,7 +280,7 @@ paging_init (void)
vmem_map = (struct page *) vmalloc_end;
efi_memmap_walk(create_mem_map_page_table, NULL);
- mem_map = contig_page_data.node_mem_map = vmem_map;
+ NODE_DATA(0)->node_mem_map = vmem_map;
free_area_init_node(0, &contig_page_data, zones_size,
0, zholes_size);
diff -puN arch/ppc64/mm/init.c~A6-no_arch_mem_map_init arch/ppc64/mm/init.c
--- memhotplug/arch/ppc64/mm/init.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/arch/ppc64/mm/init.c 2005-03-04 13:41:28.000000000 -0800
@@ -658,7 +658,6 @@ void __init paging_init(void)
free_area_init_node(0, &contig_page_data, zones_size,
__pa(PAGE_OFFSET) >> PAGE_SHIFT, zholes_size);
- mem_map = contig_page_data.node_mem_map;
}
#endif /* CONFIG_DISCONTIGMEM */
diff -puN arch/sh/mm/init.c~A6-no_arch_mem_map_init arch/sh/mm/init.c
--- memhotplug/arch/sh/mm/init.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/arch/sh/mm/init.c 2005-03-04 09:16:41.000000000 -0800
@@ -216,8 +216,6 @@ void __init paging_init(void)
#endif
NODE_DATA(0)->node_mem_map = NULL;
free_area_init_node(0, NODE_DATA(0), zones_size, __MEMORY_START >> PAGE_SHIFT, 0);
- /* XXX: MRB-remove - this doesn't seem sane, should this be done somewhere else ?*/
- mem_map = NODE_DATA(0)->node_mem_map;
#ifdef CONFIG_DISCONTIGMEM
/*
diff -puN arch/sh64/mm/init.c~A6-no_arch_mem_map_init arch/sh64/mm/init.c
--- memhotplug/arch/sh64/mm/init.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/arch/sh64/mm/init.c 2005-03-04 09:16:41.000000000 -0800
@@ -124,9 +124,6 @@ void __init paging_init(void)
zones_size[ZONE_DMA] = MAX_LOW_PFN - START_PFN;
NODE_DATA(0)->node_mem_map = NULL;
free_area_init_node(0, NODE_DATA(0), zones_size, __MEMORY_START >> PAGE_SHIFT, 0);
-
- /* XXX: MRB-remove - this doesn't seem sane, should this be done somewhere else ?*/
- mem_map = NODE_DATA(0)->node_mem_map;
}
void __init mem_init(void)
diff -puN arch/sparc/mm/srmmu.c~A6-no_arch_mem_map_init arch/sparc/mm/srmmu.c
--- memhotplug/arch/sparc/mm/srmmu.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/arch/sparc/mm/srmmu.c 2005-03-04 09:16:41.000000000 -0800
@@ -1344,7 +1344,6 @@ void __init srmmu_paging_init(void)
free_area_init_node(0, &contig_page_data, zones_size,
pfn_base, zholes_size);
- mem_map = contig_page_data.node_mem_map;
}
}
diff -puN arch/sparc/mm/sun4c.c~A6-no_arch_mem_map_init arch/sparc/mm/sun4c.c
--- memhotplug/arch/sparc/mm/sun4c.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/arch/sparc/mm/sun4c.c 2005-03-04 09:16:41.000000000 -0800
@@ -2117,7 +2117,6 @@ void __init sun4c_paging_init(void)
free_area_init_node(0, &contig_page_data, zones_size,
pfn_base, zholes_size);
- mem_map = contig_page_data.node_mem_map;
}
cnt = 0;
diff -puN arch/sparc64/mm/init.c~A6-no_arch_mem_map_init arch/sparc64/mm/init.c
--- memhotplug/arch/sparc64/mm/init.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/arch/sparc64/mm/init.c 2005-03-04 09:16:41.000000000 -0800
@@ -1512,7 +1512,6 @@ void __init paging_init(void)
free_area_init_node(0, &contig_page_data, zones_size,
phys_base >> PAGE_SHIFT, zholes_size);
- mem_map = contig_page_data.node_mem_map;
}
device_scan();
diff -puN arch/v850/kernel/setup.c~A6-no_arch_mem_map_init arch/v850/kernel/setup.c
--- memhotplug/arch/v850/kernel/setup.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/arch/v850/kernel/setup.c 2005-03-04 09:16:41.000000000 -0800
@@ -283,5 +283,4 @@ init_mem_alloc (unsigned long ram_start,
NODE_DATA(0)->node_mem_map = NULL;
free_area_init_node (0, NODE_DATA(0), zones_size,
ADDR_TO_PAGE (PAGE_OFFSET), 0);
- mem_map = NODE_DATA(0)->node_mem_map;
}
diff -puN mm/page_alloc.c~A6-no_arch_mem_map_init mm/page_alloc.c
--- memhotplug/mm/page_alloc.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/mm/page_alloc.c 2005-03-04 13:41:29.000000000 -0800
@@ -1730,14 +1730,25 @@ static void __init free_area_init_core(s
}
}
-void __init node_alloc_mem_map(struct pglist_data *pgdat)
+static void __init alloc_node_mem_map(struct pglist_data *pgdat)
{
unsigned long size;
- size = (pgdat->node_spanned_pages + 1) * sizeof(struct page);
- pgdat->node_mem_map = alloc_bootmem_node(pgdat, size);
+ /* Skip empty nodes */
+ if (!pgdat->node_spanned_pages)
+ return;
+
+ /* ia64 gets its own node_mem_map, before this, without bootmem */
+ if (!pgdat->node_mem_map) {
+ size = (pgdat->node_spanned_pages + 1) * sizeof(struct page);
+ pgdat->node_mem_map = alloc_bootmem_node(pgdat, size);
+ }
#ifndef CONFIG_DISCONTIGMEM
- mem_map = contig_page_data.node_mem_map;
+ /*
+ * With no DISCONTIG, the global mem_map is just set as node 0's
+ */
+ if (pgdat == NODE_DATA(0))
+ mem_map = NODE_DATA(0)->node_mem_map;
#endif
}
@@ -1749,8 +1760,7 @@ void __init free_area_init_node(int nid,
pgdat->node_start_pfn = node_start_pfn;
calculate_zone_totalpages(pgdat, zones_size, zholes_size);
- if (!pfn_to_page(node_start_pfn))
- node_alloc_mem_map(pgdat);
+ alloc_node_mem_map(pgdat);
free_area_init_core(pgdat, zones_size, zholes_size);
}
diff -puN arch/i386/kernel/mpparse.c~A6-no_arch_mem_map_init arch/i386/kernel/mpparse.c
diff -puN arch/i386/kernel/setup.c~A6-no_arch_mem_map_init arch/i386/kernel/setup.c
diff -puN arch/m32r/mm/init.c~A6-no_arch_mem_map_init arch/m32r/mm/init.c
--- memhotplug/arch/m32r/mm/init.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/arch/m32r/mm/init.c 2005-03-04 09:16:41.000000000 -0800
@@ -121,8 +121,6 @@ unsigned long __init zone_sizes_init(voi
free_area_init_node(0, NODE_DATA(0), zones_size, start_pfn, 0);
- mem_map = contig_page_data.node_mem_map;
-
return 0;
}
#else /* CONFIG_DISCONTIGMEM */
diff -puN arch/um/kernel/physmem.c~A6-no_arch_mem_map_init arch/um/kernel/physmem.c
--- memhotplug/arch/um/kernel/physmem.c~A6-no_arch_mem_map_init 2005-03-04 09:16:41.000000000 -0800
+++ memhotplug-dave/arch/um/kernel/physmem.c 2005-03-04 09:16:41.000000000 -0800
@@ -294,7 +294,6 @@ int init_maps(unsigned long physmem, uns
INIT_LIST_HEAD(&p->lru);
}
- mem_map = map;
max_mapnr = total_pages;
return(0);
}
_
next reply other threads:[~2005-03-05 0:11 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-03-05 0:11 Dave Hansen [this message]
2005-03-05 2:04 ` need ia64 testers: no per-arch mem_map init Jesse Barnes
2005-03-07 19:04 ` Jesse Barnes
2005-03-07 19:07 ` Dave Hansen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1109981490.1976.17.camel@localhost \
--to=haveblue@us.ibm.com \
--cc=linux-ia64@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.