From 4dd5d00eccd8a70862f9129601ebe1e0e1bebcc3 Mon Sep 17 00:00:00 2001 From: Daniel Colascione Date: Wed, 3 Jan 2018 12:01:02 -0800 Subject: [PATCH] Pin lmkd for real We pin lmkd in memory so that we don't take page faults (and thus requisition memory) while we're in the process of responding to a low-memory condition. mlockall(2) is the right primitive for this pinning. Previously, we used the MCL_FUTURE flag to mlockall: used this way, mlockall doesn't actually pin all pages in memory, since MCL_FUTURE affects only the default flags for future mappings and doesn't affect mapping already in existence at the time of the mlockall call --- like the lmkd executable itself. This patch adds the MCL_CURRENT flag, which also pins all pages already mapped. Test: code inspection Change-Id: I4563959367a2f0a9cadc3ea41731b7f311326685 --- lmkd/lmkd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lmkd/lmkd.c b/lmkd/lmkd.c index 5cfa2c887..fd83ecc28 100644 --- a/lmkd/lmkd.c +++ b/lmkd/lmkd.c @@ -900,7 +900,9 @@ int main(int argc __unused, char **argv __unused) { downgrade_pressure = (int64_t)property_get_int32("ro.lmk.downgrade_pressure", 60); is_go_device = property_get_bool("ro.config.low_ram", false); - mlockall(MCL_FUTURE); + if (mlockall(MCL_CURRENT | MCL_FUTURE)) + ALOGW("mlockall failed: errno=%d", errno); + sched_setscheduler(0, SCHED_FIFO, ¶m); if (!init()) mainloop();