Validate the ProcessRecord while iterating LRU list with ProcLock

Fix a race condition where the ProcessRecord has been invalidated
but it hasn't been removed from LRU list, meanwhile another thread
iterates the LRU list with the ProcLock, thus the ProcessRecord
should be validated.

Bug: 180849723
Test: atest CtsAppTestCases:ActivityManagerTest
Test: Manual - randomly kill other processes during above test
Change-Id: I76570a7717b98b499b865acf590af7a2133c36d9
This commit is contained in:
Jing Ji
2021-02-24 23:30:30 -08:00
parent baba083691
commit 7abcdb592e

View File

@@ -306,6 +306,7 @@ import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsService;
import com.android.internal.app.ProcessMap;
import com.android.internal.app.SystemUserHomeActivity;
import com.android.internal.app.procstats.ProcessState;
import com.android.internal.app.procstats.ProcessStats;
import com.android.internal.compat.CompatibilityChangeConfig;
import com.android.internal.content.PackageHelper;
@@ -3779,10 +3780,11 @@ public class ActivityManagerService extends IActivityManager.Stub
mi.getTotalUss(), mi.getTotalRss(), false,
ProcessStats.ADD_PSS_EXTERNAL_SLOW, duration);
proc.getPkgList().forEachPackageProcessStats(holder -> {
final ProcessState state = holder.state;
FrameworkStatsLog.write(FrameworkStatsLog.PROCESS_MEMORY_STAT_REPORTED,
proc.info.uid,
holder.state.getName(),
holder.state.getPackage(),
state != null ? state.getName() : proc.processName,
state != null ? state.getPackage() : proc.info.packageName,
mi.getTotalPss(),
mi.getTotalUss(),
mi.getTotalRss(),
@@ -7249,6 +7251,9 @@ public class ActivityManagerService extends IActivityManager.Stub
final long memoryGrowthThreshold =
Math.max(totalMemoryInKb / 100, MINIMUM_MEMORY_GROWTH_THRESHOLD);
mProcessList.forEachLruProcessesLOSP(false, proc -> {
if (proc.getThread() == null) {
return;
}
final ProcessProfileRecord pr = proc.mProfile;
final ProcessStateRecord state = proc.mState;
final int setProcState = state.getSetProcState();
@@ -14024,6 +14029,9 @@ public class ActivityManagerService extends IActivityManager.Stub
final long uptimeSince = curUptime - mLastPowerCheckUptime;
mLastPowerCheckUptime = curUptime;
mProcessList.forEachLruProcessesLOSP(false, app -> {
if (app.getThread() == null) {
return;
}
if (app.mState.getSetProcState() >= ActivityManager.PROCESS_STATE_HOME) {
int cpuLimit;
long checkDur = curUptime - app.mState.getWhenUnimportant();
@@ -14125,11 +14133,12 @@ public class ActivityManagerService extends IActivityManager.Stub
mBatteryStatsService.reportExcessiveCpu(app.info.uid, app.processName,
uptimeSince, cputimeUsed);
app.getPkgList().forEachPackageProcessStats(holder -> {
final ProcessState state = holder.state;
FrameworkStatsLog.write(
FrameworkStatsLog.EXCESSIVE_CPU_USAGE_REPORTED,
app.info.uid,
processName,
holder.state.getPackage(),
state != null ? state.getPackage() : app.info.packageName,
holder.appVersion);
});
return true;