From d816ab7c549438f23be5b17e888e182b2f78f03b Mon Sep 17 00:00:00 2001 From: Martin Liu Date: Wed, 2 Sep 2020 23:15:18 +0800 Subject: [PATCH] lmkd: fix possible long stall state If the first PSI event triggers a kill, lmkd won't resume polling immediately after the process has died. Instead, it will wait until the next PSI event to resume the polling which is too late when the device is under memory pressure. This happens if data communication with AMS happens after previous polling window expired, in which case paused handler gets reset and polling does not resume after the kill. Fix this by changing pause handler reset logic. Bug: 167562248 Test: memory pressure test Signed-off-by: Martin Liu Signed-off-by: Suren Baghdasaryan Merged-In: I10c65c85b718a656e3d8991bf09948b96da895cb Change-Id: I10c65c85b718a656e3d8991bf09948b96da895cb --- lmkd.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lmkd.cpp b/lmkd.cpp index 0f46f0a..68e884e 100644 --- a/lmkd.cpp +++ b/lmkd.cpp @@ -3087,6 +3087,8 @@ static bool polling_paused(struct polling_params *poll_params) { static void resume_polling(struct polling_params *poll_params, struct timespec curr_tm) { poll_params->poll_start_tm = curr_tm; poll_params->poll_handler = poll_params->paused_handler; + poll_params->polling_interval_ms = PSI_POLL_PERIOD_SHORT_MS; + poll_params->paused_handler = NULL; } static void call_handler(struct event_handler_info* handler_info, @@ -3121,7 +3123,6 @@ static void call_handler(struct event_handler_info* handler_info, if (get_time_diff_ms(&poll_params->poll_start_tm, &curr_tm) > PSI_WINDOW_SIZE_MS) { /* Polled for the duration of PSI window, time to stop */ poll_params->poll_handler = NULL; - poll_params->paused_handler = NULL; } break; } @@ -3146,12 +3147,8 @@ static void mainloop(void) { bool poll_now; clock_gettime(CLOCK_MONOTONIC_COARSE, &curr_tm); - if (poll_params.poll_handler == poll_params.paused_handler) { - /* - * Just transitioned into POLLING_RESUME. Reset paused_handler - * and poll immediately - */ - poll_params.paused_handler = NULL; + if (poll_params.update == POLLING_RESUME) { + /* Just transitioned into POLLING_RESUME, poll immediately. */ poll_now = true; nevents = 0; } else { @@ -3182,6 +3179,7 @@ static void mainloop(void) { stop_wait_for_proc_kill(false); if (polling_paused(&poll_params)) { clock_gettime(CLOCK_MONOTONIC_COARSE, &curr_tm); + poll_params.update = POLLING_RESUME; resume_polling(&poll_params, curr_tm); } }