|
@@ -2553,7 +2553,7 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc)
|
|
|
sc->gfp_mask |= __GFP_HIGHMEM;
|
|
|
|
|
|
for_each_zone_zonelist_nodemask(zone, z, zonelist,
|
|
|
- requested_highidx, sc->nodemask) {
|
|
|
+ gfp_zone(sc->gfp_mask), sc->nodemask) {
|
|
|
enum zone_type classzone_idx;
|
|
|
|
|
|
if (!populated_zone(zone))
|
|
@@ -3318,6 +3318,20 @@ static void kswapd_try_to_sleep(pg_data_t *pgdat, int order,
|
|
|
/* Try to sleep for a short interval */
|
|
|
if (prepare_kswapd_sleep(pgdat, order, remaining,
|
|
|
balanced_classzone_idx)) {
|
|
|
+ /*
|
|
|
+ * Compaction records what page blocks it recently failed to
|
|
|
+ * isolate pages from and skips them in the future scanning.
|
|
|
+ * When kswapd is going to sleep, it is reasonable to assume
|
|
|
+ * that pages and compaction may succeed so reset the cache.
|
|
|
+ */
|
|
|
+ reset_isolation_suitable(pgdat);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We have freed the memory, now we should compact it to make
|
|
|
+ * allocation of the requested order possible.
|
|
|
+ */
|
|
|
+ wakeup_kcompactd(pgdat, order, classzone_idx);
|
|
|
+
|
|
|
remaining = schedule_timeout(HZ/10);
|
|
|
finish_wait(&pgdat->kswapd_wait, &wait);
|
|
|
prepare_to_wait(&pgdat->kswapd_wait, &wait, TASK_INTERRUPTIBLE);
|
|
@@ -3341,20 +3355,6 @@ static void kswapd_try_to_sleep(pg_data_t *pgdat, int order,
|
|
|
*/
|
|
|
set_pgdat_percpu_threshold(pgdat, calculate_normal_threshold);
|
|
|
|
|
|
- /*
|
|
|
- * Compaction records what page blocks it recently failed to
|
|
|
- * isolate pages from and skips them in the future scanning.
|
|
|
- * When kswapd is going to sleep, it is reasonable to assume
|
|
|
- * that pages and compaction may succeed so reset the cache.
|
|
|
- */
|
|
|
- reset_isolation_suitable(pgdat);
|
|
|
-
|
|
|
- /*
|
|
|
- * We have freed the memory, now we should compact it to make
|
|
|
- * allocation of the requested order possible.
|
|
|
- */
|
|
|
- wakeup_kcompactd(pgdat, order, classzone_idx);
|
|
|
-
|
|
|
if (!kthread_should_stop())
|
|
|
schedule();
|
|
|
|