diff options
author | Björn Bidar | 2022-03-25 02:51:40 +0200 |
---|---|---|
committer | Björn Bidar | 2022-06-11 14:10:58 +0300 |
commit | 05a0260e8dc51ce338d4ba7d1a9ffcd6b73d04b2 (patch) | |
tree | 5685de18d1c76307f59556bfbe7d2aa2f461b601 /0017-ZEN-mm-Increment-kswapd_waiters-for-throttled-direct.patch | |
parent | 2c114d74749ddbf43bad8b112b3674bd81d01d27 (diff) | |
download | aur-05a0260e8dc51ce338d4ba7d1a9ffcd6b73d04b2.tar.gz |
Update to 5.17.0.pf1
- New upstream release based on 5.17.0
- Update kernel configs from arch and arch32
- Disable projectc patch-set for now in favor of ZEN interactive
patches
Diffstat (limited to '0017-ZEN-mm-Increment-kswapd_waiters-for-throttled-direct.patch')
-rw-r--r-- | 0017-ZEN-mm-Increment-kswapd_waiters-for-throttled-direct.patch | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/0017-ZEN-mm-Increment-kswapd_waiters-for-throttled-direct.patch b/0017-ZEN-mm-Increment-kswapd_waiters-for-throttled-direct.patch new file mode 100644 index 000000000000..dbfc3e3f0a71 --- /dev/null +++ b/0017-ZEN-mm-Increment-kswapd_waiters-for-throttled-direct.patch @@ -0,0 +1,81 @@ +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 3d8cbc64af8c..478df26db0e9 100644 +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -3658,7 +3658,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; +@@ -3687,6 +3687,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) +@@ -3752,7 +3756,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; + } +@@ -3774,11 +3778,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; +@@ -4268,7 +4275,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 */ +-- +2.35.1 + |