Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 234865
b: refs/heads/master
c: f9c6025
h: refs/heads/master
i:
  234863: cba4426
v: v3
  • Loading branch information
Tejun Heo committed Feb 16, 2011
1 parent 655d54b commit 5a1dbb0
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 38 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 97e7b78d0674882a0aae043fda428c583dbb225d
refs/heads/master: f9c60251c3d08777db6758cafd959a55a838abd6
83 changes: 46 additions & 37 deletions trunk/arch/x86/mm/numa_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -292,40 +292,8 @@ 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)
static int __init numa_cleanup_meminfo(struct numa_meminfo *mi)
{
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)
{
struct numa_meminfo *mi = &numa_meminfo;
int i;

/*
Expand Down Expand Up @@ -368,6 +336,49 @@ static int __init numa_register_memblks(void)
}
}

return 0;
}

/*
* 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(struct numa_meminfo *mi)
{
int i;

/* Account for nodes with cpus and no memory */
nodes_or(node_possible_map, mem_nodes_parsed, cpu_nodes_parsed);
if (WARN_ON(nodes_empty(node_possible_map)))
return -EINVAL;

memnode_shift = compute_hash_shift(mi);
if (memnode_shift < 0) {
printk(KERN_ERR "NUMA: No NUMA node hash function found. Contact maintainer\n");
Expand Down Expand Up @@ -823,12 +834,10 @@ void __init initmem_init(void)
nodes_clear(node_possible_map);
nodes_clear(node_online_map);
#endif
/* Account for nodes with cpus and no memory */
nodes_or(node_possible_map, mem_nodes_parsed, cpu_nodes_parsed);
if (WARN_ON(nodes_empty(node_possible_map)))
if (numa_cleanup_meminfo(&numa_meminfo) < 0)
continue;

if (numa_register_memblks() < 0)
if (numa_register_memblks(&numa_meminfo) < 0)
continue;

for (j = 0; j < nr_cpu_ids; j++) {
Expand Down

0 comments on commit 5a1dbb0

Please sign in to comment.