Fix the stats log in lmkd
1. let logs be written to statsd directly like all other stats logs.
+ stats log should not write to logd anymore(b/78239479)
2. fixed the log format
+ need to embed the elapsed real time in the log
3. fixed the log context reuse problem
+reset the log context buffer and internal state before reuse
Bug: 78603347
Bug: 78239479
Test: tested with alloc_stress, and saw logs written to statsd
performance measurement (memory & cpu):
https://paste.googleplex.com/5508158646648832
Change-Id: I345f0eace8ba1687ff480fb88e9abba1d8533f76
diff --git a/lmkd/statslog.c b/lmkd/statslog.c
index db7a76a..66d1164 100644
--- a/lmkd/statslog.c
+++ b/lmkd/statslog.c
@@ -16,8 +16,16 @@
#include <assert.h>
#include <errno.h>
-#include <log/log_event_list.h>
#include <log/log_id.h>
+#include <stats_event_list.h>
+#include <time.h>
+
+static int64_t getElapsedRealTimeNs() {
+ struct timespec t;
+ t.tv_sec = t.tv_nsec = 0;
+ clock_gettime(CLOCK_BOOTTIME, &t);
+ return (int64_t)t.tv_sec * 1000000000LL + t.tv_nsec;
+}
/**
* Logs the change in LMKD state which is used as start/stop boundaries for logging
@@ -32,6 +40,12 @@
return ret;
}
+ reset_log_context(ctx);
+
+ if ((ret = android_log_write_int64(ctx, getElapsedRealTimeNs())) < 0) {
+ return ret;
+ }
+
if ((ret = android_log_write_int32(ctx, code)) < 0) {
return ret;
}
@@ -39,7 +53,8 @@
if ((ret = android_log_write_int32(ctx, state)) < 0) {
return ret;
}
- return ret;
+
+ return write_to_logger(ctx, LOG_ID_STATS);
}
/**
@@ -56,6 +71,11 @@
if (!ctx) {
return ret;
}
+ reset_log_context(ctx);
+
+ if ((ret = android_log_write_int64(ctx, getElapsedRealTimeNs())) < 0) {
+ return ret;
+ }
if ((ret = android_log_write_int32(ctx, code)) < 0) {
return ret;
@@ -93,8 +113,5 @@
return ret;
}
- if ((ret = android_log_write_list(ctx, LOG_ID_STATS)) < 0) {
- return ret;
- }
- return ret;
+ return write_to_logger(ctx, LOG_ID_STATS);
}