lmkd: reroute atoms logging to AMS
- Added new lmkd message for clients to subscribe LMK_ASYNC_EVENT_STAT
- Added support to write kill & mem stats information via data socket
to be read & parsed on the AMS Java side for future logging to statsd
Bug: 184698933
Test: lmkd_unit_test - test check_for_oom tests lmkd message send to AMS
Test: statsd_testdrive 51 54 to inspect statsd logged atoms data
Change-Id: Id682a438c87b3e4503261d26461f6cee641d86c4
Merged-In: Id682a438c87b3e4503261d26461f6cee641d86c4
diff --git a/lmkd.cpp b/lmkd.cpp
index e1c5276..dc93ac4 100644
--- a/lmkd.cpp
+++ b/lmkd.cpp
@@ -22,7 +22,6 @@
#include <pwd.h>
#include <sched.h>
#include <signal.h>
-#include <statslog_lmkd.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
@@ -758,6 +757,49 @@
}
}
+/*
+ * Write the kill_stat/memory_stat over the data socket to be propagated via AMS to statsd
+ */
+static void stats_write_lmk_kill_occurred(struct kill_stat *kill_st,
+ struct memory_stat *mem_st) {
+ LMK_KILL_OCCURRED_PACKET packet;
+ const size_t len = lmkd_pack_set_kill_occurred(packet, kill_st, mem_st);
+ if (len == 0) {
+ return;
+ }
+
+ for (int i = 0; i < MAX_DATA_CONN; i++) {
+ if (data_sock[i].sock >= 0 && data_sock[i].async_event_mask & 1 << LMK_ASYNC_EVENT_STAT) {
+ ctrl_data_write(i, packet, len);
+ }
+ }
+
+}
+
+static void stats_write_lmk_kill_occurred_pid(int pid, struct kill_stat *kill_st,
+ struct memory_stat *mem_st) {
+ kill_st->taskname = stats_get_task_name(pid);
+ if (kill_st->taskname != NULL) {
+ stats_write_lmk_kill_occurred(kill_st, mem_st);
+ }
+}
+
+/*
+ * Write the state_changed over the data socket to be propagated via AMS to statsd
+ */
+static void stats_write_lmk_state_changed(enum lmk_state state) {
+ LMKD_CTRL_PACKET packet_state_changed;
+ const size_t len = lmkd_pack_set_state_changed(packet_state_changed, state);
+ if (len == 0) {
+ return;
+ }
+ for (int i = 0; i < MAX_DATA_CONN; i++) {
+ if (data_sock[i].sock >= 0 && data_sock[i].async_event_mask & 1 << LMK_ASYNC_EVENT_STAT) {
+ ctrl_data_write(i, (char*)packet_state_changed, len);
+ }
+ }
+}
+
static void poll_kernel(int poll_fd) {
if (poll_fd == -1) {
// not waiting
@@ -2183,8 +2225,7 @@
if (killed_size >= 0) {
if (!lmk_state_change_start) {
lmk_state_change_start = true;
- stats_write_lmk_state_changed(
- android::lmkd::stats::LMK_STATE_CHANGED__STATE__START);
+ stats_write_lmk_state_changed(STATE_START);
}
break;
}
@@ -2195,7 +2236,7 @@
}
if (lmk_state_change_start) {
- stats_write_lmk_state_changed(android::lmkd::stats::LMK_STATE_CHANGED__STATE__STOP);
+ stats_write_lmk_state_changed(STATE_STOP);
}
return killed_size;