mm, compaction: ignore fragindex from compaction_zonelist_suitable()
[linux-2.6-microblaze.git] / mm / compaction.c
index 86d4d0b..b918bdb 100644 (file)
@@ -1379,7 +1379,6 @@ static enum compact_result __compaction_suitable(struct zone *zone, int order,
                                        int classzone_idx,
                                        unsigned long wmark_target)
 {
-       int fragindex;
        unsigned long watermark;
 
        if (is_via_compact_memory(order))
@@ -1415,6 +1414,18 @@ static enum compact_result __compaction_suitable(struct zone *zone, int order,
                                                ALLOC_CMA, wmark_target))
                return COMPACT_SKIPPED;
 
+       return COMPACT_CONTINUE;
+}
+
+enum compact_result compaction_suitable(struct zone *zone, int order,
+                                       unsigned int alloc_flags,
+                                       int classzone_idx)
+{
+       enum compact_result ret;
+       int fragindex;
+
+       ret = __compaction_suitable(zone, order, alloc_flags, classzone_idx,
+                                   zone_page_state(zone, NR_FREE_PAGES));
        /*
         * fragmentation index determines if allocation failures are due to
         * low memory or external fragmentation
@@ -1426,21 +1437,12 @@ static enum compact_result __compaction_suitable(struct zone *zone, int order,
         *
         * Only compact if a failure would be due to fragmentation.
         */
-       fragindex = fragmentation_index(zone, order);
-       if (fragindex >= 0 && fragindex <= sysctl_extfrag_threshold)
-               return COMPACT_NOT_SUITABLE_ZONE;
-
-       return COMPACT_CONTINUE;
-}
-
-enum compact_result compaction_suitable(struct zone *zone, int order,
-                                       unsigned int alloc_flags,
-                                       int classzone_idx)
-{
-       enum compact_result ret;
+       if (ret == COMPACT_CONTINUE) {
+               fragindex = fragmentation_index(zone, order);
+               if (fragindex >= 0 && fragindex <= sysctl_extfrag_threshold)
+                       ret = COMPACT_NOT_SUITABLE_ZONE;
+       }
 
-       ret = __compaction_suitable(zone, order, alloc_flags, classzone_idx,
-                                   zone_page_state(zone, NR_FREE_PAGES));
        trace_mm_compaction_suitable(zone, order, ret);
        if (ret == COMPACT_NOT_SUITABLE_ZONE)
                ret = COMPACT_SKIPPED;
@@ -1473,8 +1475,7 @@ bool compaction_zonelist_suitable(struct alloc_context *ac, int order,
                available += zone_page_state_snapshot(zone, NR_FREE_PAGES);
                compact_result = __compaction_suitable(zone, order, alloc_flags,
                                ac_classzone_idx(ac), available);
-               if (compact_result != COMPACT_SKIPPED &&
-                               compact_result != COMPACT_NOT_SUITABLE_ZONE)
+               if (compact_result != COMPACT_SKIPPED)
                        return true;
        }