|
@@ -2848,6 +2848,8 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags,
|
|
|
{
|
|
|
struct zoneref *z = ac->preferred_zoneref;
|
|
|
struct zone *zone;
|
|
|
+ struct pglist_data *last_pgdat_dirty_limit = NULL;
|
|
|
+
|
|
|
/*
|
|
|
* Scan zonelist, looking for a zone with enough free.
|
|
|
* See also __cpuset_node_allowed() comment in kernel/cpuset.c.
|
|
@@ -2880,8 +2882,15 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags,
|
|
|
* will require awareness of nodes in the
|
|
|
* dirty-throttling and the flusher threads.
|
|
|
*/
|
|
|
- if (ac->spread_dirty_pages && !node_dirty_ok(zone->zone_pgdat))
|
|
|
- continue;
|
|
|
+ if (ac->spread_dirty_pages) {
|
|
|
+ if (last_pgdat_dirty_limit == zone->zone_pgdat)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (!node_dirty_ok(zone->zone_pgdat)) {
|
|
|
+ last_pgdat_dirty_limit = zone->zone_pgdat;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
mark = zone->watermark[alloc_flags & ALLOC_WMARK_MASK];
|
|
|
if (!zone_watermark_fast(zone, order, mark,
|