|
@@ -878,7 +878,9 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order,
|
|
mark = (*z)->pages_high;
|
|
mark = (*z)->pages_high;
|
|
if (!zone_watermark_ok(*z, order, mark,
|
|
if (!zone_watermark_ok(*z, order, mark,
|
|
classzone_idx, alloc_flags))
|
|
classzone_idx, alloc_flags))
|
|
- continue;
|
|
|
|
|
|
+ if (!zone_reclaim_mode ||
|
|
|
|
+ !zone_reclaim(*z, gfp_mask, order))
|
|
|
|
+ continue;
|
|
}
|
|
}
|
|
|
|
|
|
page = buffered_rmqueue(zonelist, *z, order, gfp_mask);
|
|
page = buffered_rmqueue(zonelist, *z, order, gfp_mask);
|
|
@@ -1595,13 +1597,22 @@ static void __init build_zonelists(pg_data_t *pgdat)
|
|
prev_node = local_node;
|
|
prev_node = local_node;
|
|
nodes_clear(used_mask);
|
|
nodes_clear(used_mask);
|
|
while ((node = find_next_best_node(local_node, &used_mask)) >= 0) {
|
|
while ((node = find_next_best_node(local_node, &used_mask)) >= 0) {
|
|
|
|
+ int distance = node_distance(local_node, node);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * If another node is sufficiently far away then it is better
|
|
|
|
+ * to reclaim pages in a zone before going off node.
|
|
|
|
+ */
|
|
|
|
+ if (distance > RECLAIM_DISTANCE)
|
|
|
|
+ zone_reclaim_mode = 1;
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* We don't want to pressure a particular node.
|
|
* We don't want to pressure a particular node.
|
|
* So adding penalty to the first node in same
|
|
* So adding penalty to the first node in same
|
|
* distance group to make it round-robin.
|
|
* distance group to make it round-robin.
|
|
*/
|
|
*/
|
|
- if (node_distance(local_node, node) !=
|
|
|
|
- node_distance(local_node, prev_node))
|
|
|
|
|
|
+
|
|
|
|
+ if (distance != node_distance(local_node, prev_node))
|
|
node_load[node] += load;
|
|
node_load[node] += load;
|
|
prev_node = node;
|
|
prev_node = node;
|
|
load--;
|
|
load--;
|