From 4d8791b1f1e0ef30089ea6feae5b450ebbeb5134 Mon Sep 17 00:00:00 2001 From: Suren Baghdasaryan Date: Tue, 18 Jul 2023 19:38:29 +0000 Subject: [PATCH] lmkd: check pgrefill vmstat when deciding active reclaim In rare cases it's possible that pgscan is not changing because inactive LRU is empty and can't be refilled from the active LRU due to all pages being hot. In such conditions pgscan_kswapd/pgscan_direct will not change while pgrefill will be increasing due to active LRU being scanned. Lmkd would incorrectly treat this situation as if no reclaim activity happened. Change lmkd to check pgrefill as well to detect such conditions. Bug: 288383787 Change-Id: I6b49607429e2f673bba2645ccddff1a141afbcd1 Signed-off-by: Suren Baghdasaryan --- lmkd.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lmkd.cpp b/lmkd.cpp index c604826..d5f694a 100644 --- a/lmkd.cpp +++ b/lmkd.cpp @@ -467,6 +467,7 @@ enum vmstat_field { VS_PGSCAN_KSWAPD, VS_PGSCAN_DIRECT, VS_PGSCAN_DIRECT_THROTTLE, + VS_PGREFILL, VS_FIELD_COUNT }; @@ -479,6 +480,7 @@ static const char* const vmstat_field_names[VS_FIELD_COUNT] = { "pgscan_kswapd", "pgscan_direct", "pgscan_direct_throttle", + "pgrefill", }; union vmstat { @@ -491,6 +493,7 @@ union vmstat { int64_t pgscan_kswapd; int64_t pgscan_direct; int64_t pgscan_direct_throttle; + int64_t pgrefill; } field; int64_t arr[VS_FIELD_COUNT]; }; @@ -2586,6 +2589,7 @@ static void mp_event_psi(int data, uint32_t events, struct polling_params *poll_ static int64_t base_file_lru; static int64_t init_pgscan_kswapd; static int64_t init_pgscan_direct; + static int64_t init_pgrefill; static bool killing; static int thrashing_limit = thrashing_limit_pct; static struct zone_watermarks watermarks; @@ -2671,9 +2675,14 @@ static void mp_event_psi(int data, uint32_t events, struct polling_params *poll_ if (vs.field.pgscan_direct != init_pgscan_direct) { init_pgscan_direct = vs.field.pgscan_direct; init_pgscan_kswapd = vs.field.pgscan_kswapd; + init_pgrefill = vs.field.pgrefill; reclaim = DIRECT_RECLAIM; } else if (vs.field.pgscan_kswapd != init_pgscan_kswapd) { init_pgscan_kswapd = vs.field.pgscan_kswapd; + init_pgrefill = vs.field.pgrefill; + reclaim = KSWAPD_RECLAIM; + } else if (vs.field.pgrefill != init_pgrefill) { + init_pgrefill = vs.field.pgrefill; reclaim = KSWAPD_RECLAIM; } else if (workingset_refault_file == prev_workingset_refault) { /*