Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7abcdb59 authored by Jing Ji's avatar Jing Ji
Browse files

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
parent baba0836
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -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;