mm: compaction: defer compaction using an exponential backoff when compaction fails
[safe/jmp/linux-2.6] / mm / page_alloc.c
index cd88a86..95ad42d 100644 (file)
@@ -1769,7 +1769,7 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
 {
        struct page *page;
 
-       if (!order)
+       if (!order || compaction_deferred(preferred_zone))
                return NULL;
 
        *did_some_progress = try_to_compact_pages(zonelist, order, gfp_mask,
@@ -1785,6 +1785,8 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
                                alloc_flags, preferred_zone,
                                migratetype);
                if (page) {
+                       preferred_zone->compact_considered = 0;
+                       preferred_zone->compact_defer_shift = 0;
                        count_vm_event(COMPACTSUCCESS);
                        return page;
                }
@@ -1795,6 +1797,7 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
                 * but not enough to satisfy watermarks.
                 */
                count_vm_event(COMPACTFAIL);
+               defer_compaction(preferred_zone);
 
                cond_resched();
        }