diff options
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index 5daf606e0a35..b07c48b09a93 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -1867,6 +1867,23 @@ out: | |||
1867 | 1867 | ||
1868 | try_to_freeze(); | 1868 | try_to_freeze(); |
1869 | 1869 | ||
1870 | /* | ||
1871 | * Fragmentation may mean that the system cannot be | ||
1872 | * rebalanced for high-order allocations in all zones. | ||
1873 | * At this point, if nr_reclaimed < SWAP_CLUSTER_MAX, | ||
1874 | * it means the zones have been fully scanned and are still | ||
1875 | * not balanced. For high-order allocations, there is | ||
1876 | * little point trying all over again as kswapd may | ||
1877 | * infinite loop. | ||
1878 | * | ||
1879 | * Instead, recheck all watermarks at order-0 as they | ||
1880 | * are the most important. If watermarks are ok, kswapd will go | ||
1881 | * back to sleep. High-order users can still perform direct | ||
1882 | * reclaim if they wish. | ||
1883 | */ | ||
1884 | if (sc.nr_reclaimed < SWAP_CLUSTER_MAX) | ||
1885 | order = sc.order = 0; | ||
1886 | |||
1870 | goto loop_again; | 1887 | goto loop_again; |
1871 | } | 1888 | } |
1872 | 1889 | ||