> On Wed, 20 Apr 2011, James Bottomley wrote: > > > > This is probably because the parisc's DISCONTIGMEM memory ranges don't > > > have bits set in N_NORMAL_MEMORY. > > > > > > diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c > > > --- a/arch/parisc/mm/init.c > > > +++ b/arch/parisc/mm/init.c > > > @@ -266,8 +266,10 @@ static void __init setup_bootmem(void) > > > } > > > memset(pfnnid_map, 0xff, sizeof(pfnnid_map)); > > > > > > - for (i = 0; i < npmem_ranges; i++) > > > + for (i = 0; i < npmem_ranges; i++) { > > > + node_set_state(i, N_NORMAL_MEMORY); > > > node_set_online(i); > > > + } > > > #endif > > > > Yes, this seems to be the missing piece that gets it to boot. We really > > need this in generic code, unless someone wants to run through all the > > other arch's doing it ... > > > > Looking at all other architectures that allow ARCH_DISCONTIGMEM_ENABLE, we > already know x86 is fine, avr32 disables ARCH_DISCONTIGMEM_ENABLE entirely > because its code only brings online node 0, and tile already sets the bit > in N_NORMAL_MEMORY correctly when bringing a node online, probably because > it was introduced after the various node state masks were added in > 7ea1530ab3fd back in October 2007. > > So we're really only talking about alpha, ia64, m32r, m68k, and mips and > it only seems to matter when using CONFIG_SLUB, which isn't surprising > when greping for it: > > $ grep -r N_NORMAL_MEMORY mm/* > mm/memcontrol.c: if (!node_state(node, N_NORMAL_MEMORY)) > mm/memcontrol.c: if (!node_state(node, N_NORMAL_MEMORY)) > mm/page_alloc.c: [N_NORMAL_MEMORY] = { { [0] = 1UL } }, > mm/page_alloc.c: node_set_state(zone_to_nid(zone), N_NORMAL_MEMORY); > mm/slub.c: for_each_node_state(node, N_NORMAL_MEMORY) { > mm/slub.c: for_each_node_state(node, N_NORMAL_MEMORY) { > mm/slub.c: for_each_node_state(node, N_NORMAL_MEMORY) { > mm/slub.c: for_each_node_state(node, N_NORMAL_MEMORY) { > mm/slub.c: for_each_node_state(node, N_NORMAL_MEMORY) { > mm/slub.c: for_each_node_state(node, N_NORMAL_MEMORY) { > mm/slub.c: for_each_node_state(node, N_NORMAL_MEMORY) { > mm/slub.c: for_each_node_state(node, N_NORMAL_MEMORY) { > mm/slub.c: for_each_node_state(node, N_NORMAL_MEMORY) { > mm/slub.c: for_each_node_state(node, N_NORMAL_MEMORY) > > Those memory controller occurrences only result in it passing a node id of > -1 to kmalloc_node() which means no specific node target, and that's fine > for DISCONTIGMEM since we don't care about any proximity between memory > ranges. > > This should fix the remaining architectures so they can use CONFIG_SLUB, > but I hope it can be tested by the individual arch maintainers like you > did for parisc. ia64 and mips have CONFIG_ARCH_POPULATES_NODE_MAP and it initialize N_NORMAL_MEMORY automatically if my understand is correct. (plz see free_area_init_nodes) I guess alpha and m32r have no active developrs. only m68k seems to be need fix and we have a chance to get a review... -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>