|
@@ -1867,6 +1867,23 @@ out:
|
|
|
|
|
|
try_to_freeze();
|
|
try_to_freeze();
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Fragmentation may mean that the system cannot be
|
|
|
|
+ * rebalanced for high-order allocations in all zones.
|
|
|
|
+ * At this point, if nr_reclaimed < SWAP_CLUSTER_MAX,
|
|
|
|
+ * it means the zones have been fully scanned and are still
|
|
|
|
+ * not balanced. For high-order allocations, there is
|
|
|
|
+ * little point trying all over again as kswapd may
|
|
|
|
+ * infinite loop.
|
|
|
|
+ *
|
|
|
|
+ * Instead, recheck all watermarks at order-0 as they
|
|
|
|
+ * are the most important. If watermarks are ok, kswapd will go
|
|
|
|
+ * back to sleep. High-order users can still perform direct
|
|
|
|
+ * reclaim if they wish.
|
|
|
|
+ */
|
|
|
|
+ if (sc.nr_reclaimed < SWAP_CLUSTER_MAX)
|
|
|
|
+ order = sc.order = 0;
|
|
|
|
+
|
|
goto loop_again;
|
|
goto loop_again;
|
|
}
|
|
}
|
|
|
|
|