diff options
Diffstat (limited to '0016-ZEN-mm-Increment-kswapd_waiters-for-throttled-direct.patch')
-rw-r--r-- | 0016-ZEN-mm-Increment-kswapd_waiters-for-throttled-direct.patch | 78 |
1 files changed, 0 insertions, 78 deletions
diff --git a/0016-ZEN-mm-Increment-kswapd_waiters-for-throttled-direct.patch b/0016-ZEN-mm-Increment-kswapd_waiters-for-throttled-direct.patch deleted file mode 100644 index 31f070145587..000000000000 --- a/0016-ZEN-mm-Increment-kswapd_waiters-for-throttled-direct.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Sultan Alsawaf <sultan@kerneltoast.com> -Date: Fri, 16 Jul 2021 23:35:47 -0700 -Subject: [PATCH] ZEN: mm: Increment kswapd_waiters for throttled direct - reclaimers - -Throttled direct reclaimers will wake up kswapd and wait for kswapd to -satisfy their page allocation request, even when the failed allocation -lacks the __GFP_KSWAPD_RECLAIM flag in its gfp mask. As a result, kswapd -may think that there are no waiters and thus exit prematurely, causing -throttled direct reclaimers lacking __GFP_KSWAPD_RECLAIM to stall on -waiting for kswapd to wake them up. Incrementing the kswapd_waiters -counter when such direct reclaimers become throttled fixes the problem. - -Signed-off-by: Sultan Alsawaf <sultan@kerneltoast.com> ---- - mm/vmscan.c | 17 ++++++++++++----- - 1 file changed, 12 insertions(+), 5 deletions(-) - -diff --git a/mm/vmscan.c b/mm/vmscan.c -index c1936a256ed1e858febfe8f090f889f4a6238ff0..cd9d3535a2f757e464b3a41b24001fd51bc33aa7 100644 ---- a/mm/vmscan.c -+++ b/mm/vmscan.c -@@ -3608,7 +3608,7 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist, - return 0; - } - --static bool allow_direct_reclaim(pg_data_t *pgdat) -+static bool allow_direct_reclaim(pg_data_t *pgdat, bool using_kswapd) - { - struct zone *zone; - unsigned long pfmemalloc_reserve = 0; -@@ -3637,6 +3637,10 @@ static bool allow_direct_reclaim(pg_data_t *pgdat) - - wmark_ok = free_pages > pfmemalloc_reserve / 2; - -+ /* The throttled direct reclaimer is now a kswapd waiter */ -+ if (unlikely(!using_kswapd && !wmark_ok)) -+ atomic_long_inc(&kswapd_waiters); -+ - /* kswapd must be awake if processes are being throttled */ - if (!wmark_ok && waitqueue_active(&pgdat->kswapd_wait)) { - if (READ_ONCE(pgdat->kswapd_highest_zoneidx) > ZONE_NORMAL) -@@ -3702,7 +3706,7 @@ static bool throttle_direct_reclaim(gfp_t gfp_mask, struct zonelist *zonelist, - - /* Throttle based on the first usable node */ - pgdat = zone->zone_pgdat; -- if (allow_direct_reclaim(pgdat)) -+ if (allow_direct_reclaim(pgdat, gfp_mask & __GFP_KSWAPD_RECLAIM)) - goto out; - break; - } -@@ -3724,11 +3728,14 @@ static bool throttle_direct_reclaim(gfp_t gfp_mask, struct zonelist *zonelist, - */ - if (!(gfp_mask & __GFP_FS)) - wait_event_interruptible_timeout(pgdat->pfmemalloc_wait, -- allow_direct_reclaim(pgdat), HZ); -+ allow_direct_reclaim(pgdat, true), HZ); - else - /* Throttle until kswapd wakes the process */ - wait_event_killable(zone->zone_pgdat->pfmemalloc_wait, -- allow_direct_reclaim(pgdat)); -+ allow_direct_reclaim(pgdat, true)); -+ -+ if (unlikely(!(gfp_mask & __GFP_KSWAPD_RECLAIM))) -+ atomic_long_dec(&kswapd_waiters); - - if (fatal_signal_pending(current)) - return true; -@@ -4221,7 +4228,7 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx) - * able to safely make forward progress. Wake them - */ - if (waitqueue_active(&pgdat->pfmemalloc_wait) && -- allow_direct_reclaim(pgdat)) -+ allow_direct_reclaim(pgdat, true)) - wake_up_all(&pgdat->pfmemalloc_wait); - - /* Check if kswapd should be suspending */ |