lmkd: only mlockall() if enabled

Move process initialization, mlockall() and sched_setscheduler() to
only occur if initialization succeeds and is enabled.  This
conserves mlock'd memory and a FIFO processing slot if (deprecated)
kernel lowmemorykiller is active.

Cleanup: Android coding standard compliance.

Test: lmkd_unit_test
Bug: 33808187
Bug: 72838192
Change-Id: I51af0235c8eca4ef958ef2d83a8071ff58b49d78
This commit is contained in:
Mark Salyzyn 2018-03-21 12:24:58 -07:00
parent ce32539cf3
commit 721d7c7fa3
2 changed files with 27 additions and 18 deletions

View file

@ -3,8 +3,8 @@ cc_binary {
srcs: ["lmkd.c"],
shared_libs: [
"liblog",
"libcutils",
"liblog",
],
local_include_dirs: ["include"],
cflags: ["-Werror"],

View file

@ -29,8 +29,8 @@
#include <sys/eventfd.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/sysinfo.h>
#include <sys/types.h>
#include <unistd.h>
#include <cutils/properties.h>
@ -77,7 +77,7 @@
#define SYSTEM_ADJ (-900)
/* default to old in-kernel interface if no memory pressure events */
static int use_inkernel_interface = 1;
static bool use_inkernel_interface = true;
static bool has_inkernel_module;
/* memory pressure levels */
@ -326,8 +326,9 @@ static void cmd_procprio(LMKD_CTRL_PACKET packet) {
return;
}
if (use_inkernel_interface)
if (use_inkernel_interface) {
return;
}
if (params.oomadj >= 900) {
soft_limit_mult = 0;
@ -393,8 +394,9 @@ static void cmd_procprio(LMKD_CTRL_PACKET packet) {
static void cmd_procremove(LMKD_CTRL_PACKET packet) {
struct lmk_procremove params;
if (use_inkernel_interface)
if (use_inkernel_interface) {
return;
}
lmkd_pack_get_procremove(packet, &params);
pid_remove(params.pid);
@ -1205,21 +1207,28 @@ int main(int argc __unused, char **argv __unused) {
kill_timeout_ms =
(unsigned long)property_get_int32("ro.lmk.kill_timeout_ms", 0);
// MCL_ONFAULT pins pages as they fault instead of loading
// everything immediately all at once. (Which would be bad,
// because as of this writing, we have a lot of mapped pages we
// never use.) Old kernels will see MCL_ONFAULT and fail with
// EINVAL; we ignore this failure.
//
// N.B. read the man page for mlockall. MCL_CURRENT | MCL_ONFAULT
// pins ⊆ MCL_CURRENT, converging to just MCL_CURRENT as we fault
// in pages.
if (mlockall(MCL_CURRENT | MCL_FUTURE | MCL_ONFAULT) && errno != EINVAL)
ALOGW("mlockall failed: errno=%d", errno);
if (!init()) {
if (!use_inkernel_interface) {
/*
* MCL_ONFAULT pins pages as they fault instead of loading
* everything immediately all at once. (Which would be bad,
* because as of this writing, we have a lot of mapped pages we
* never use.) Old kernels will see MCL_ONFAULT and fail with
* EINVAL; we ignore this failure.
*
* N.B. read the man page for mlockall. MCL_CURRENT | MCL_ONFAULT
* pins MCL_CURRENT, converging to just MCL_CURRENT as we fault
* in pages.
*/
if (mlockall(MCL_CURRENT | MCL_FUTURE | MCL_ONFAULT) && (errno != EINVAL)) {
ALOGW("mlockall failed %s", strerror(errno));
}
sched_setscheduler(0, SCHED_FIFO, &param);
}
sched_setscheduler(0, SCHED_FIFO, &param);
if (!init())
mainloop();
}
ALOGI("exiting");
return 0;