Update AppCompacted WW atom to include device ZRAM usage.
We log free ZRAM in kilobytes before and after the compaction event.
Test: manually verified am_compact and statsd logging looks correct.
Bug: 123623746
Change-Id: I20d5991fb1d060584d415b76c30769fe9f049ffd
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 7ddb783..1c7eb41 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -4746,6 +4746,12 @@
// The process state at the time of compaction.
optional android.app.ProcessStateEnum process_state = 16 [default = PROCESS_STATE_UNKNOWN];
+
+ // Free ZRAM in kilobytes before compaction.
+ optional int64 before_zram_free_kilobytes = 17;
+
+ // Free ZRAM in kilobytes after compaction.
+ optional int64 after_zram_free_kilobytes = 18;
}
/**
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index aba81af..149ef54 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -2439,4 +2439,11 @@
VMDebug.attachAgent(library + "=" + options, classLoader);
}
}
+
+ /**
+ * Return the current free ZRAM usage in kilobytes.
+ *
+ * @hide
+ */
+ public static native long getZramFreeKb();
}
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index e9035ed..195fe58 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -737,6 +737,25 @@
return env->NewStringUTF(s.c_str());
}
+static jlong android_os_Debug_getFreeZramKb(JNIEnv* env, jobject clazz) {
+
+ jlong zramFreeKb = 0;
+
+ std::string status_path = android::base::StringPrintf("/proc/meminfo");
+ UniqueFile file = MakeUniqueFile(status_path.c_str(), "re");
+
+ char line[256];
+ while (file != nullptr && fgets(line, sizeof(line), file.get())) {
+ jlong v;
+ if (sscanf(line, "SwapFree: %" SCNd64 " kB", &v) == 1) {
+ zramFreeKb = v;
+ break;
+ }
+ }
+
+ return zramFreeKb;
+}
+
/*
* JNI registration.
*/
@@ -778,6 +797,8 @@
(void*)android_os_Debug_dumpNativeBacktraceToFileTimeout },
{ "getUnreachableMemory", "(IZ)Ljava/lang/String;",
(void*)android_os_Debug_getUnreachableMemory },
+ { "getZramFreeKb", "()J",
+ (void*)android_os_Debug_getFreeZramKb },
};
int register_android_os_Debug(JNIEnv *env)
diff --git a/services/core/java/com/android/server/am/AppCompactor.java b/services/core/java/com/android/server/am/AppCompactor.java
index c7e4fc7..17ffd9c 100644
--- a/services/core/java/com/android/server/am/AppCompactor.java
+++ b/services/core/java/com/android/server/am/AppCompactor.java
@@ -28,6 +28,7 @@
import android.app.ActivityManager;
import android.app.ActivityThread;
+import android.os.Debug;
import android.os.Handler;
import android.os.Message;
import android.os.Process;
@@ -410,6 +411,7 @@
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Compact "
+ ((pendingAction == COMPACT_PROCESS_SOME) ? "some" : "full")
+ ": " + name);
+ long zramFreeKbBefore = Debug.getZramFreeKb();
long[] rssBefore = Process.getRss(pid);
FileOutputStream fos = new FileOutputStream("/proc/" + pid + "/reclaim");
fos.write(action.getBytes());
@@ -417,10 +419,12 @@
long[] rssAfter = Process.getRss(pid);
long end = SystemClock.uptimeMillis();
long time = end - start;
+ long zramFreeKbAfter = Debug.getZramFreeKb();
EventLog.writeEvent(EventLogTags.AM_COMPACT, pid, name, action,
rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3],
rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time,
- lastCompactAction, lastCompactTime, msg.arg1, msg.arg2);
+ lastCompactAction, lastCompactTime, msg.arg1, msg.arg2,
+ zramFreeKbBefore, zramFreeKbAfter);
// Note that as above not taking mPhenoTypeFlagLock here to avoid locking
// on every single compaction for a flag that will seldom change and the
// impact of reading the wrong value here is low.
@@ -429,7 +433,8 @@
rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3],
rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time,
lastCompactAction, lastCompactTime, msg.arg1,
- ActivityManager.processStateAmToProto(msg.arg2));
+ ActivityManager.processStateAmToProto(msg.arg2),
+ zramFreeKbBefore, zramFreeKbAfter);
}
synchronized (mAm) {
proc.lastCompactTime = end;
diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags
index a71f6af..4b12e43 100644
--- a/services/core/java/com/android/server/am/EventLogTags.logtags
+++ b/services/core/java/com/android/server/am/EventLogTags.logtags
@@ -138,4 +138,4 @@
30061 am_remove_task (Task ID|1|5), (Stack ID|1|5)
# The task is being compacted
-30063 am_compact (Pid|1|5),(Process Name|3),(Action|3),(BeforeRssTotal|2|2),(BeforeRssFile|2|2),(BeforeRssAnon|2|2),(BeforeRssSwap|2|2),(AfterRssTotal|2|2),(AfterRssFile|2|2),(AfterRssAnon|2|2),(AfterRssSwap|2|2),(Time|2|3),(LastAction|1|2),(LastActionTimestamp|2|3),(setAdj|1|2),(procState|1|2)
+30063 am_compact (Pid|1|5),(Process Name|3),(Action|3),(BeforeRssTotal|2|2),(BeforeRssFile|2|2),(BeforeRssAnon|2|2),(BeforeRssSwap|2|2),(AfterRssTotal|2|2),(AfterRssFile|2|2),(AfterRssAnon|2|2),(AfterRssSwap|2|2),(Time|2|3),(LastAction|1|2),(LastActionTimestamp|2|3),(setAdj|1|2),(procState|1|2),(BeforeZRAMFree|2|2),(AfterZRAMFree|2|2)