mm: mark the correct zone as full when scanning zonelists
[pandora-kernel.git] / mm / mmzone.c
index 0959ee1..16ce8b9 100644 (file)
@@ -14,8 +14,6 @@ struct pglist_data *first_online_pgdat(void)
        return NODE_DATA(first_online_node);
 }
 
-EXPORT_SYMBOL(first_online_pgdat);
-
 struct pglist_data *next_online_pgdat(struct pglist_data *pgdat)
 {
        int nid = next_online_node(pgdat->node_id);
@@ -24,8 +22,6 @@ struct pglist_data *next_online_pgdat(struct pglist_data *pgdat)
                return NULL;
        return NODE_DATA(nid);
 }
-EXPORT_SYMBOL(next_online_pgdat);
-
 
 /*
  * next_zone - helper magic for for_each_zone()
@@ -45,5 +41,34 @@ struct zone *next_zone(struct zone *zone)
        }
        return zone;
 }
-EXPORT_SYMBOL(next_zone);
 
+static inline int zref_in_nodemask(struct zoneref *zref, nodemask_t *nodes)
+{
+#ifdef CONFIG_NUMA
+       return node_isset(zonelist_node_idx(zref), *nodes);
+#else
+       return 1;
+#endif /* CONFIG_NUMA */
+}
+
+/* Returns the next zone at or below highest_zoneidx in a zonelist */
+struct zoneref *next_zones_zonelist(struct zoneref *z,
+                                       enum zone_type highest_zoneidx,
+                                       nodemask_t *nodes,
+                                       struct zone **zone)
+{
+       /*
+        * Find the next suitable zone to use for the allocation.
+        * Only filter based on nodemask if it's set
+        */
+       if (likely(nodes == NULL))
+               while (zonelist_zone_idx(z) > highest_zoneidx)
+                       z++;
+       else
+               while (zonelist_zone_idx(z) > highest_zoneidx ||
+                               (z->zone && !zref_in_nodemask(z, nodes)))
+                       z++;
+
+       *zone = zonelist_zone(z);
+       return z;
+}