|
@@ -34,20 +34,26 @@ extern unsigned long compaction_suitable(struct zone *zone, int order);
|
|
* allocation success. 1 << compact_defer_limit compactions are skipped up
|
|
* allocation success. 1 << compact_defer_limit compactions are skipped up
|
|
* to a limit of 1 << COMPACT_MAX_DEFER_SHIFT
|
|
* to a limit of 1 << COMPACT_MAX_DEFER_SHIFT
|
|
*/
|
|
*/
|
|
-static inline void defer_compaction(struct zone *zone)
|
|
|
|
|
|
+static inline void defer_compaction(struct zone *zone, int order)
|
|
{
|
|
{
|
|
zone->compact_considered = 0;
|
|
zone->compact_considered = 0;
|
|
zone->compact_defer_shift++;
|
|
zone->compact_defer_shift++;
|
|
|
|
|
|
|
|
+ if (order < zone->compact_order_failed)
|
|
|
|
+ zone->compact_order_failed = order;
|
|
|
|
+
|
|
if (zone->compact_defer_shift > COMPACT_MAX_DEFER_SHIFT)
|
|
if (zone->compact_defer_shift > COMPACT_MAX_DEFER_SHIFT)
|
|
zone->compact_defer_shift = COMPACT_MAX_DEFER_SHIFT;
|
|
zone->compact_defer_shift = COMPACT_MAX_DEFER_SHIFT;
|
|
}
|
|
}
|
|
|
|
|
|
/* Returns true if compaction should be skipped this time */
|
|
/* Returns true if compaction should be skipped this time */
|
|
-static inline bool compaction_deferred(struct zone *zone)
|
|
|
|
|
|
+static inline bool compaction_deferred(struct zone *zone, int order)
|
|
{
|
|
{
|
|
unsigned long defer_limit = 1UL << zone->compact_defer_shift;
|
|
unsigned long defer_limit = 1UL << zone->compact_defer_shift;
|
|
|
|
|
|
|
|
+ if (order < zone->compact_order_failed)
|
|
|
|
+ return false;
|
|
|
|
+
|
|
/* Avoid possible overflow */
|
|
/* Avoid possible overflow */
|
|
if (++zone->compact_considered > defer_limit)
|
|
if (++zone->compact_considered > defer_limit)
|
|
zone->compact_considered = defer_limit;
|
|
zone->compact_considered = defer_limit;
|
|
@@ -73,11 +79,11 @@ static inline unsigned long compaction_suitable(struct zone *zone, int order)
|
|
return COMPACT_SKIPPED;
|
|
return COMPACT_SKIPPED;
|
|
}
|
|
}
|
|
|
|
|
|
-static inline void defer_compaction(struct zone *zone)
|
|
|
|
|
|
+static inline void defer_compaction(struct zone *zone, int order)
|
|
{
|
|
{
|
|
}
|
|
}
|
|
|
|
|
|
-static inline bool compaction_deferred(struct zone *zone)
|
|
|
|
|
|
+static inline bool compaction_deferred(struct zone *zone, int order)
|
|
{
|
|
{
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|