Defer UID data removal until after reading is finished

Removing UID data inside readDelta() callbacks causes deadlocks when
BPF data is used. Instead, build a list of UIDs to remove but defer
deletion until after readDelta() returns.

Bug: 177011744
Change-Id: I38e037b89e71b0cb1ba01374189ba8b7af01d632
Signed-off-by: Connor O'Brien <connoro@google.com>
This commit is contained in:
Connor O'Brien
2021-01-15 15:45:36 -08:00
parent b7322dae52
commit 9451197708

View File

@@ -12928,16 +12928,17 @@ public class BatteryStatsImpl extends BatteryStats {
mWakeLockAllocationsUs = null;
final long startTimeMs = mClocks.uptimeMillis();
final long elapsedRealtimeMs = mClocks.elapsedRealtime();
final List<Integer> uidsToRemove = new ArrayList<>();
mCpuUidFreqTimeReader.readDelta((uid, cpuFreqTimeMs) -> {
uid = mapUid(uid);
if (Process.isIsolated(uid)) {
mCpuUidFreqTimeReader.removeUid(uid);
uidsToRemove.add(uid);
if (DEBUG) Slog.d(TAG, "Got freq readings for an isolated uid: " + uid);
return;
}
if (!mUserInfoProvider.exists(UserHandle.getUserId(uid))) {
if (DEBUG) Slog.d(TAG, "Got freq readings for an invalid user's uid " + uid);
mCpuUidFreqTimeReader.removeUid(uid);
uidsToRemove.add(uid);
return;
}
final Uid u = getUidStatsLocked(uid, elapsedRealtimeMs, startTimeMs);
@@ -12996,6 +12997,9 @@ public class BatteryStatsImpl extends BatteryStats {
}
}
});
for (int uid : uidsToRemove) {
mCpuUidFreqTimeReader.removeUid(uid);
}
final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs;
if (DEBUG_ENERGY_CPU || elapsedTimeMs >= 100) {
@@ -13042,21 +13046,25 @@ public class BatteryStatsImpl extends BatteryStats {
public void readKernelUidCpuActiveTimesLocked(boolean onBattery) {
final long startTimeMs = mClocks.uptimeMillis();
final long elapsedRealtimeMs = mClocks.elapsedRealtime();
final List<Integer> uidsToRemove = new ArrayList<>();
mCpuUidActiveTimeReader.readDelta((uid, cpuActiveTimesMs) -> {
uid = mapUid(uid);
if (Process.isIsolated(uid)) {
mCpuUidActiveTimeReader.removeUid(uid);
uidsToRemove.add(uid);
if (DEBUG) Slog.w(TAG, "Got active times for an isolated uid: " + uid);
return;
}
if (!mUserInfoProvider.exists(UserHandle.getUserId(uid))) {
if (DEBUG) Slog.w(TAG, "Got active times for an invalid user's uid " + uid);
mCpuUidActiveTimeReader.removeUid(uid);
uidsToRemove.add(uid);
return;
}
final Uid u = getUidStatsLocked(uid, elapsedRealtimeMs, startTimeMs);
u.mCpuActiveTimeMs.addCountLocked(cpuActiveTimesMs, onBattery);
});
for (int uid : uidsToRemove) {
mCpuUidActiveTimeReader.removeUid(uid);
}
final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs;
if (DEBUG_ENERGY_CPU || elapsedTimeMs >= 100) {
@@ -13072,21 +13080,25 @@ public class BatteryStatsImpl extends BatteryStats {
public void readKernelUidCpuClusterTimesLocked(boolean onBattery) {
final long startTimeMs = mClocks.uptimeMillis();
final long elapsedRealtimeMs = mClocks.elapsedRealtime();
final List<Integer> uidsToRemove = new ArrayList<>();
mCpuUidClusterTimeReader.readDelta((uid, cpuClusterTimesMs) -> {
uid = mapUid(uid);
if (Process.isIsolated(uid)) {
mCpuUidClusterTimeReader.removeUid(uid);
uidsToRemove.add(uid);
if (DEBUG) Slog.w(TAG, "Got cluster times for an isolated uid: " + uid);
return;
}
if (!mUserInfoProvider.exists(UserHandle.getUserId(uid))) {
if (DEBUG) Slog.w(TAG, "Got cluster times for an invalid user's uid " + uid);
mCpuUidClusterTimeReader.removeUid(uid);
uidsToRemove.add(uid);
return;
}
final Uid u = getUidStatsLocked(uid, elapsedRealtimeMs, startTimeMs);
u.mCpuClusterTimesMs.addCountLocked(cpuClusterTimesMs, onBattery);
});
for (int uid : uidsToRemove) {
mCpuUidClusterTimeReader.removeUid(uid);
}
final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs;
if (DEBUG_ENERGY_CPU || elapsedTimeMs >= 100) {