[PATCH] Handle holes in node mask in node fallback list setup
Change the find_next_best_node algorithm to correctly skip over holes in the node online mask. Previously it would not handle missing nodes correctly and cause crashes at boot. [Written by Linus, tested by AK] Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
cfe91f9ce2
commit
4cf808eb44
|
@ -1541,29 +1541,29 @@ static int __initdata node_load[MAX_NUMNODES];
|
|||
*/
|
||||
static int __init find_next_best_node(int node, nodemask_t *used_node_mask)
|
||||
{
|
||||
int i, n, val;
|
||||
int n, val;
|
||||
int min_val = INT_MAX;
|
||||
int best_node = -1;
|
||||
|
||||
for_each_online_node(i) {
|
||||
cpumask_t tmp;
|
||||
/* Use the local node if we haven't already */
|
||||
if (!node_isset(node, *used_node_mask)) {
|
||||
node_set(node, *used_node_mask);
|
||||
return node;
|
||||
}
|
||||
|
||||
/* Start from local node */
|
||||
n = (node+i) % num_online_nodes();
|
||||
for_each_online_node(n) {
|
||||
cpumask_t tmp;
|
||||
|
||||
/* Don't want a node to appear more than once */
|
||||
if (node_isset(n, *used_node_mask))
|
||||
continue;
|
||||
|
||||
/* Use the local node if we haven't already */
|
||||
if (!node_isset(node, *used_node_mask)) {
|
||||
best_node = node;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Use the distance array to find the distance */
|
||||
val = node_distance(node, n);
|
||||
|
||||
/* Penalize nodes under us ("prefer the next node") */
|
||||
val += (n < node);
|
||||
|
||||
/* Give preference to headless and unused nodes */
|
||||
tmp = node_to_cpumask(n);
|
||||
if (!cpus_empty(tmp))
|
||||
|
|
Loading…
Reference in a new issue