Looks like that wasn't helping after all. I still need to revert said
commit. Guess I'll have to check what node_present_pages(node) returns
in each case ...

Cheers,

  MIchael


On Sat, Apr 23, 2011 at 1:31 PM, Michael Schmitz
<[email protected]> wrote:
> I'll check this out - might well be the correct fix for our problems.
>
> Cheers,
>
>  Michael
>
>
> On Thu, Apr 21, 2011 at 8:19 PM, Geert Uytterhoeven
> <[email protected]> wrote:
>> ---------- Forwarded message ----------
>> From: David Rientjes <[email protected]>
>> Date: Thu, Apr 21, 2011 at 01:12
>> Subject: Re: [PATCH v3] mm: make expand_downwards symmetrical to 
>> expand_upwards
>> To: James Bottomley <[email protected]>
>> Cc: KOSAKI Motohiro <[email protected]>, Pekka Enberg
>> <[email protected]>, Christoph Lameter <[email protected]>, Michal Hocko
>> <[email protected]>, Andrew Morton <[email protected]>, Hugh
>> Dickins <[email protected]>, [email protected], LKML
>> <[email protected]>, [email protected], Ingo
>> Molnar <[email protected]>, x86 maintainers <[email protected]>
>>
>>
>> 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.
>>
>> diff --git a/arch/alpha/mm/numa.c b/arch/alpha/mm/numa.c
>> --- a/arch/alpha/mm/numa.c
>> +++ b/arch/alpha/mm/numa.c
>> @@ -245,6 +245,7 @@ setup_memory_node(int nid, void *kernel_end)
>>                        bootmap_size, BOOTMEM_DEFAULT);
>>        printk(" reserving pages %ld:%ld\n", bootmap_start,
>> bootmap_start+PFN_UP(bootmap_size));
>>
>> +       node_set_state(nid, N_NORMAL_MEMORY);
>>        node_set_online(nid);
>>  }
>>
>> diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c
>> --- a/arch/ia64/mm/discontig.c
>> +++ b/arch/ia64/mm/discontig.c
>> @@ -573,6 +573,8 @@ void __init find_memory(void)
>>                                  map>>PAGE_SHIFT,
>>                                  bdp->node_min_pfn,
>>                                  bdp->node_low_pfn);
>> +               if (node_present_pages(node))
>> +                       node_set_state(node, N_NORMAL_MEMORY);
>>        }
>>
>>        efi_memmap_walk(filter_rsvd_memory, free_node_bootmem);
>> diff --git a/arch/m32r/kernel/setup.c b/arch/m32r/kernel/setup.c
>> --- a/arch/m32r/kernel/setup.c
>> +++ b/arch/m32r/kernel/setup.c
>> @@ -247,7 +247,9 @@ void __init setup_arch(char **cmdline_p)
>>
>>  #ifdef CONFIG_DISCONTIGMEM
>>        nodes_clear(node_online_map);
>> +       node_set_state(0, N_NORMAL_MEMORY);     /* always has memory */
>>        node_set_online(0);
>> +       node_set_state(1, N_NORMAL_MEMORY);     /* always has memory */
>>        node_set_online(1);
>>  #endif /* CONFIG_DISCONTIGMEM */
>>
>> diff --git a/arch/m68k/mm/init_mm.c b/arch/m68k/mm/init_mm.c
>> --- a/arch/m68k/mm/init_mm.c
>> +++ b/arch/m68k/mm/init_mm.c
>> @@ -59,6 +59,8 @@ void __init m68k_setup_node(int node)
>>        }
>>  #endif
>>        pg_data_map[node].bdata = bootmem_node_data + node;
>> +       if (node_present_pages(node))
>> +               node_set_state(node, N_NORMAL_MEMORY);
>>        node_set_online(node);
>>  }
>>
>> diff --git a/arch/mips/sgi-ip27/ip27-memory.c 
>> b/arch/mips/sgi-ip27/ip27-memory.c
>> --- a/arch/mips/sgi-ip27/ip27-memory.c
>> +++ b/arch/mips/sgi-ip27/ip27-memory.c
>> @@ -471,6 +471,8 @@ void __init paging_init(void)
>>
>>                if (end_pfn > max_low_pfn)
>>                        max_low_pfn = end_pfn;
>> +               if (end_pfn > start_pfn)
>> +                       node_set_state(node, N_NORMAL_MEMORY);
>>        }
>>        zones_size[ZONE_NORMAL] = max_low_pfn;
>>        free_area_init_nodes(zones_size);
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to [email protected]
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at  http://www.tux.org/lkml/
>>
>>
>>
>> --
>> Gr{oetje,eeting}s,
>>
>>                         Geert
>>
>> --
>> Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- 
>> [email protected]
>>
>> In personal conversations with technical people, I call myself a hacker. But
>> when I'm talking to journalists I just say "programmer" or something like 
>> that.
>>                                 -- Linus Torvalds
>>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-m68k" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to