lkml.org 
[lkml]   [2011]   [Feb]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 15/26] x86-64, NUMA: Unify the rest of memblk registration
    On 02/12/2011 09:10 AM, Tejun Heo wrote:
    > Move the remaining memblk registration logic from acpi_scan_nodes() to
    > numa_register_memblks() and initmem_init().
    >
    > This applies nodes_cover_memory() sanity check, memory node sorting
    > and node_online() checking, which were only applied to acpi, to all
    > init methods.
    >
    > As all memblk registration is moved to common code, active range
    > clearing is moved to initmem_init() too and removed from bad_srat().
    >
    > Signed-off-by: Tejun Heo <tj@kernel.org>
    > Cc: Yinghai Lu <yinghai@kernel.org>
    > Cc: Brian Gerst <brgerst@gmail.com>
    > Cc: Cyrill Gorcunov <gorcunov@gmail.com>
    > Cc: Shaohui Zheng <shaohui.zheng@intel.com>
    > Cc: David Rientjes <rientjes@google.com>
    > Cc: Ingo Molnar <mingo@elte.hu>
    > Cc: H. Peter Anvin <hpa@linux.intel.com>
    > ---
    > arch/x86/mm/amdtopology_64.c | 6 ---
    > arch/x86/mm/numa_64.c | 71 +++++++++++++++++++++++++++++++++++++++---
    > arch/x86/mm/srat_64.c | 59 ----------------------------------
    > 3 files changed, 66 insertions(+), 70 deletions(-)
    >
    > diff --git a/arch/x86/mm/amdtopology_64.c b/arch/x86/mm/amdtopology_64.c
    > index 48ec374..9c9f46a 100644
    > --- a/arch/x86/mm/amdtopology_64.c
    > +++ b/arch/x86/mm/amdtopology_64.c
    > @@ -262,11 +262,5 @@ void __init amd_fake_nodes(const struct bootnode *nodes, int nr_nodes)
    >
    > int __init amd_scan_nodes(void)
    > {
    > - int i;
    > -
    > - for_each_node_mask(i, node_possible_map)
    > - setup_node_bootmem(i, numa_nodes[i].start, numa_nodes[i].end);
    > -
    > - numa_init_array();
    > return 0;
    > }
    > diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c
    > index 2e2ca94..062649d 100644
    > --- a/arch/x86/mm/numa_64.c
    > +++ b/arch/x86/mm/numa_64.c
    > @@ -287,6 +287,37 @@ setup_node_bootmem(int nodeid, unsigned long start, unsigned long end)
    > node_set_online(nodeid);
    > }
    >
    > +/*
    > + * Sanity check to catch more bad NUMA configurations (they are amazingly
    > + * common). Make sure the nodes cover all memory.
    > + */
    > +static int __init nodes_cover_memory(const struct bootnode *nodes)
    > +{
    > + unsigned long numaram, e820ram;
    > + int i;
    > +
    > + numaram = 0;
    > + for_each_node_mask(i, mem_nodes_parsed) {
    > + unsigned long s = nodes[i].start >> PAGE_SHIFT;
    > + unsigned long e = nodes[i].end >> PAGE_SHIFT;
    > + numaram += e - s;
    > + numaram -= __absent_pages_in_range(i, s, e);
    > + if ((long)numaram < 0)
    > + numaram = 0;
    > + }
    > +
    > + e820ram = max_pfn -
    > + (memblock_x86_hole_size(0, max_pfn<<PAGE_SHIFT) >> PAGE_SHIFT);
    > + /* We seem to lose 3 pages somewhere. Allow 1M of slack. */
    > + if ((long)(e820ram - numaram) >= (1<<(20 - PAGE_SHIFT))) {
    > + printk(KERN_ERR "NUMA: nodes only cover %luMB of your %luMB e820 RAM. Not used.\n",
    > + (numaram << PAGE_SHIFT) >> 20,
    > + (e820ram << PAGE_SHIFT) >> 20);
    > + return 0;
    > + }
    > + return 1;
    > +}
    > +
    > static int __init numa_register_memblks(void)
    > {
    > int i;
    > @@ -349,6 +380,25 @@ static int __init numa_register_memblks(void)
    > memblock_x86_register_active_regions(memblk_nodeid[i],
    > node_memblk_range[i].start >> PAGE_SHIFT,
    > node_memblk_range[i].end >> PAGE_SHIFT);
    > +
    > + /* for out of order entries */
    > + sort_node_map();
    > + if (!nodes_cover_memory(numa_nodes))
    > + return -EINVAL;
    > +
    > + /* Finally register nodes. */
    > + for_each_node_mask(i, node_possible_map)
    > + setup_node_bootmem(i, numa_nodes[i].start, numa_nodes[i].end);
    > +
    > + /*
    > + * Try again in case setup_node_bootmem missed one due to missing
    > + * bootmem.
    > + */
    > + for_each_node_mask(i, node_possible_map)
    > + if (!node_online(i))
    > + setup_node_bootmem(i, numa_nodes[i].start,
    > + numa_nodes[i].end);
    > +
    > return 0;
    > }

    please don't put setup_node_bootmem calling into numa_register_memblks()
    that is not related.

    put the calling in initmem_init() directly is more reasonable.

    >
    > @@ -713,15 +763,14 @@ static int dummy_numa_init(void)
    > node_set(0, cpu_nodes_parsed);
    > node_set(0, mem_nodes_parsed);
    > numa_add_memblk(0, 0, (u64)max_pfn << PAGE_SHIFT);
    > + numa_nodes[0].start = 0;
    > + numa_nodes[0].end = (u64)max_pfn << PAGE_SHIFT;
    >
    > return 0;
    > }
    >
    > static int dummy_scan_nodes(void)
    > {
    > - setup_node_bootmem(0, 0, max_pfn << PAGE_SHIFT);
    > - numa_init_array();
    > -
    > return 0;
    > }
    >
    > @@ -757,6 +806,7 @@ void __init initmem_init(void)
    > memset(node_memblk_range, 0, sizeof(node_memblk_range));
    > memset(memblk_nodeid, 0, sizeof(memblk_nodeid));
    > memset(numa_nodes, 0, sizeof(numa_nodes));
    > + remove_all_active_ranges();
    >
    > if (numa_init[i]() < 0)
    > continue;
    > @@ -781,8 +831,19 @@ void __init initmem_init(void)
    > if (numa_register_memblks() < 0)
    > continue;
    >
    > - if (!scan_nodes[i]())
    > - return;
    > + if (scan_nodes[i]() < 0)
    > + continue;
    > +
    > + for (j = 0; j < nr_cpu_ids; j++) {
    > + int nid = early_cpu_to_node(j);
    > +
    > + if (nid == NUMA_NO_NODE)
    > + continue;
    > + if (!node_online(nid))
    > + numa_clear_node(j);
    > + }
    > + numa_init_array();
    > + return;
    > }
    > BUG();
    > }
    > diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c
    > index 755d157..4a2c33b 100644
    > --- a/arch/x86/mm/srat_64.c
    > +++ b/arch/x86/mm/srat_64.c
    > @@ -44,7 +44,6 @@ static __init void bad_srat(void)
    > numa_nodes[i].start = numa_nodes[i].end = 0;
    > nodes_add[i].start = nodes_add[i].end = 0;
    > }
    > - remove_all_active_ranges();
    > }
    >
    > static __init inline int srat_disabled(void)
    > @@ -259,35 +258,6 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
    > update_nodes_add(node, start, end);
    > }
    >
    > -/* Sanity check to catch more bad SRATs (they are amazingly common).
    > - Make sure the PXMs cover all memory. */
    > -static int __init nodes_cover_memory(const struct bootnode *nodes)
    > -{
    > - int i;
    > - unsigned long pxmram, e820ram;
    > -
    > - pxmram = 0;
    > - for_each_node_mask(i, mem_nodes_parsed) {
    > - unsigned long s = nodes[i].start >> PAGE_SHIFT;
    > - unsigned long e = nodes[i].end >> PAGE_SHIFT;
    > - pxmram += e - s;
    > - pxmram -= __absent_pages_in_range(i, s, e);
    > - if ((long)pxmram < 0)
    > - pxmram = 0;
    > - }
    > -
    > - e820ram = max_pfn - (memblock_x86_hole_size(0, max_pfn<<PAGE_SHIFT)>>PAGE_SHIFT);
    > - /* We seem to lose 3 pages somewhere. Allow 1M of slack. */
    > - if ((long)(e820ram - pxmram) >= (1<<(20 - PAGE_SHIFT))) {
    > - printk(KERN_ERR
    > - "SRAT: PXMs only cover %luMB of your %luMB e820 RAM. Not used.\n",
    > - (pxmram << PAGE_SHIFT) >> 20,
    > - (e820ram << PAGE_SHIFT) >> 20);
    > - return 0;
    > - }
    > - return 1;
    > -}
    > -
    > void __init acpi_numa_arch_fixup(void) {}
    >
    > int __init x86_acpi_numa_init(void)
    > @@ -303,37 +273,8 @@ int __init x86_acpi_numa_init(void)
    > /* Use the information discovered above to actually set up the nodes. */
    > int __init acpi_scan_nodes(void)
    > {
    > - int i;
    > -
    > if (acpi_numa <= 0)
    > return -1;
    > -
    > - /* for out of order entries in SRAT */
    > - sort_node_map();
    > - if (!nodes_cover_memory(numa_nodes)) {
    > - bad_srat();
    > - return -1;
    > - }
    > -
    > - /* Finally register nodes */
    > - for_each_node_mask(i, node_possible_map)
    > - setup_node_bootmem(i, numa_nodes[i].start, numa_nodes[i].end);
    > - /* Try again in case setup_node_bootmem missed one due
    > - to missing bootmem */
    > - for_each_node_mask(i, node_possible_map)
    > - if (!node_online(i))
    > - setup_node_bootmem(i, numa_nodes[i].start,
    > - numa_nodes[i].end);
    > -
    > - for (i = 0; i < nr_cpu_ids; i++) {
    > - int node = early_cpu_to_node(i);
    > -
    > - if (node == NUMA_NO_NODE)
    > - continue;
    > - if (!node_online(node))
    > - numa_clear_node(i);
    > - }
    > - numa_init_array();
    > return 0;
    > }
    >



    \
     
     \ /
      Last update: 2011-02-13 01:49    [W:7.114 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site