Merge "Add wakeup attribution to trace" into udc-dev am: 4dd9366c10

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22192850

Change-Id: Ied9ad623004a699f5a9e0f8da408314dfc716a7c
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Suprabh Shukla
2023-03-23 22:37:24 +00:00
committed by Automerger Merge Worker
2 changed files with 27 additions and 2 deletions

View File

@@ -66,6 +66,7 @@ import android.os.Process;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.WakeLockStats; import android.os.WakeLockStats;
import android.os.WorkSource; import android.os.WorkSource;
@@ -140,6 +141,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
BatteryStatsImpl.EnergyStatsRetriever, BatteryStatsImpl.EnergyStatsRetriever,
Watchdog.Monitor { Watchdog.Monitor {
static final String TAG = "BatteryStatsService"; static final String TAG = "BatteryStatsService";
static final String TRACE_TRACK_WAKEUP_REASON = "wakeup_reason";
static final boolean DBG = false; static final boolean DBG = false;
private static final boolean BATTERY_USAGE_STORE_ENABLED = true; private static final boolean BATTERY_USAGE_STORE_ENABLED = true;
@@ -2482,6 +2484,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub
while ((reason = waitWakeup()) != null) { while ((reason = waitWakeup()) != null) {
final long nowElapsed = SystemClock.elapsedRealtime(); final long nowElapsed = SystemClock.elapsedRealtime();
final long nowUptime = SystemClock.uptimeMillis(); final long nowUptime = SystemClock.uptimeMillis();
Trace.instantForTrack(Trace.TRACE_TAG_POWER, TRACE_TRACK_WAKEUP_REASON,
nowElapsed + " " + reason);
// Wait for the completion of pending works if there is any // Wait for the completion of pending works if there is any
awaitCompletion(); awaitCompletion();
mCpuWakeupStats.noteWakeupTimeAndReason(nowElapsed, nowUptime, reason); mCpuWakeupStats.noteWakeupTimeAndReason(nowElapsed, nowUptime, reason);

View File

@@ -23,6 +23,7 @@ import static android.os.BatteryStatsInternal.CPU_WAKEUP_SUBSYSTEM_WIFI;
import android.content.Context; import android.content.Context;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerExecutor; import android.os.HandlerExecutor;
import android.os.Trace;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.DeviceConfig; import android.provider.DeviceConfig;
import android.util.IndentingPrintWriter; import android.util.IndentingPrintWriter;
@@ -55,6 +56,7 @@ public class CpuWakeupStats {
private static final String SUBSYSTEM_ALARM_STRING = "Alarm"; private static final String SUBSYSTEM_ALARM_STRING = "Alarm";
private static final String SUBSYSTEM_ALARM_WIFI = "Wifi"; private static final String SUBSYSTEM_ALARM_WIFI = "Wifi";
private static final String TRACE_TRACK_WAKEUP_ATTRIBUTION = "wakeup_attribution";
@VisibleForTesting @VisibleForTesting
static final long WAKEUP_REASON_HALF_WINDOW_MS = 500; static final long WAKEUP_REASON_HALF_WINDOW_MS = 500;
private static final long WAKEUP_WRITE_DELAY_MS = TimeUnit.MINUTES.toMillis(2); private static final long WAKEUP_WRITE_DELAY_MS = TimeUnit.MINUTES.toMillis(2);
@@ -94,13 +96,15 @@ public class CpuWakeupStats {
return FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED__REASON__UNKNOWN; return FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED__REASON__UNKNOWN;
} }
private synchronized void logWakeupToStatsLog(Wakeup wakeupToLog) { private synchronized void logWakeupAttribution(Wakeup wakeupToLog) {
if (ArrayUtils.isEmpty(wakeupToLog.mDevices)) { if (ArrayUtils.isEmpty(wakeupToLog.mDevices)) {
FrameworkStatsLog.write(FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED, FrameworkStatsLog.write(FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED,
FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED__TYPE__TYPE_UNKNOWN, FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED__TYPE__TYPE_UNKNOWN,
FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED__REASON__UNKNOWN, FrameworkStatsLog.KERNEL_WAKEUP_ATTRIBUTED__REASON__UNKNOWN,
null, null,
wakeupToLog.mElapsedMillis); wakeupToLog.mElapsedMillis);
Trace.instantForTrack(Trace.TRACE_TAG_POWER, TRACE_TRACK_WAKEUP_ATTRIBUTION,
wakeupToLog.mElapsedMillis + " --");
return; return;
} }
@@ -112,6 +116,9 @@ public class CpuWakeupStats {
Slog.wtf(TAG, "Unexpected null attribution found for " + wakeupToLog); Slog.wtf(TAG, "Unexpected null attribution found for " + wakeupToLog);
return; return;
} }
final StringBuilder traceEventBuilder = new StringBuilder();
for (int i = 0; i < wakeupAttribution.size(); i++) { for (int i = 0; i < wakeupAttribution.size(); i++) {
final int subsystem = wakeupAttribution.keyAt(i); final int subsystem = wakeupAttribution.keyAt(i);
final SparseBooleanArray uidMap = wakeupAttribution.valueAt(i); final SparseBooleanArray uidMap = wakeupAttribution.valueAt(i);
@@ -132,7 +139,19 @@ public class CpuWakeupStats {
subsystemToStatsReason(subsystem), subsystemToStatsReason(subsystem),
uids, uids,
wakeupToLog.mElapsedMillis); wakeupToLog.mElapsedMillis);
if (Trace.isTagEnabled(Trace.TRACE_TAG_POWER)) {
if (i == 0) {
traceEventBuilder.append(wakeupToLog.mElapsedMillis + " ");
}
traceEventBuilder.append((subsystemToString(subsystem)));
traceEventBuilder.append(":");
traceEventBuilder.append(Arrays.toString(uids));
traceEventBuilder.append(" ");
}
} }
Trace.instantForTrack(Trace.TRACE_TAG_POWER, TRACE_TRACK_WAKEUP_ATTRIBUTION,
traceEventBuilder.toString().trim());
} }
/** Notes a wakeup reason as reported by SuspendControlService to battery stats. */ /** Notes a wakeup reason as reported by SuspendControlService to battery stats. */
@@ -160,7 +179,7 @@ public class CpuWakeupStats {
for (int i = lastIdx; i >= 0; i--) { for (int i = lastIdx; i >= 0; i--) {
mWakeupAttribution.removeAt(i); mWakeupAttribution.removeAt(i);
} }
mHandler.postDelayed(() -> logWakeupToStatsLog(parsedWakeup), WAKEUP_WRITE_DELAY_MS); mHandler.postDelayed(() -> logWakeupAttribution(parsedWakeup), WAKEUP_WRITE_DELAY_MS);
} }
/** Notes a waking activity that could have potentially woken up the CPU. */ /** Notes a waking activity that could have potentially woken up the CPU. */