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

Commit 09ab4477 authored by Steve Kondik's avatar Steve Kondik
Browse files

Revert a couple of badly-behaving ActivityManager patches.

 * These patches together are causing a bit of havoc. Killing processes
   on the background thread often means the death takes longer,
   increasing the likelyhood of the kernel obliterating it on it's own.
   Instead of the nice happy shutdown by AM, the kernel ends up
   following up the slaughter with direct reclaim, wrecking system
   performance. This is even more apparent on low-ram systems.

 * Additionally, don't encourage services to spuriously restart as the
   second patch is doing. This compounds the problem from the first
   patch.

Revert "KillProcessGroup on background thread"

This reverts commit 5d1a70a4.

Revert "[ActivityManager] Bring up Service if not schedule to restart"

This reverts commit 4fd268b8.

Change-Id: I53ca87009d066c87bf50bde25558431f6bf74bca
parent 9be79d9e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1331,7 +1331,7 @@ public final class ActiveServices {
            return null;
        }

        if (!whileRestarting && r.restartDelay > 0 && mRestartingServices.contains(r)) {
        if (!whileRestarting && r.restartDelay > 0) {
            // If waiting for a restart, then do nothing.
            return null;
        }
+5 −43
Original line number Diff line number Diff line
@@ -1302,8 +1302,6 @@ public final class ActivityManagerService extends ActivityManagerNative
    final UiHandler mUiHandler;
    final CpuTrackerHandler mCpuTrackerHandler;
    static KillProcessBackground mKillProcessHandler;
    final class UiHandler extends Handler {
        public UiHandler() {
            super(com.android.server.UiThread.get().getLooper(), null, true);
@@ -1898,21 +1896,6 @@ public final class ActivityManagerService extends ActivityManagerNative
    static final int SCHEDULE_CPU_STATS_MSG = 1;
    static final int UPDATE_CPU_STATS_MSG = 2;
    final class KillProcessBackground extends Handler {
        public KillProcessBackground(Looper looper) {
            super(looper);
        }
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case KILL_PROCESS_GROUP_MSG:
                killProcessGroupBackground(msg.arg1, msg.arg2);
            break;
            }
        }
    };
    final class CpuTrackerHandler extends Handler {
        public CpuTrackerHandler(Looper looper) {
            super(looper);
@@ -1949,10 +1932,9 @@ public final class ActivityManagerService extends ActivityManagerNative
            removeMessages(UPDATE_CPU_STATS_MSG);
            sendEmptyMessage(UPDATE_CPU_STATS_MSG);
        }
    };
    }
    static final int COLLECT_PSS_BG_MSG = 1;
    static final int KILL_PROCESS_GROUP_MSG = 44;
    final Handler mBgHandler = new Handler(BackgroundThread.getHandler().getLooper()) {
        @Override
@@ -2214,8 +2196,6 @@ public final class ActivityManagerService extends ActivityManagerNative
        cpuTrackerThread.start();
        mCpuTrackerHandler = new CpuTrackerHandler(cpuTrackerThread.getLooper());
        mKillProcessHandler = new KillProcessBackground(BackgroundThread.getHandler().getLooper());
        mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
                "foreground", BROADCAST_FG_TIMEOUT, false);
        mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
@@ -2603,7 +2583,7 @@ public final class ActivityManagerService extends ActivityManagerNative
            if (!app.killed) {
                Slog.wtfStack(TAG, "Removing process that hasn't been killed: " + app);
                Process.killProcessQuiet(app.pid);
                killProcessGroup(app.info.uid, app.pid);
                Process.killProcessGroup(app.info.uid, app.pid);
            }
            if (lrui <= mLruProcessActivityStart) {
                mLruProcessActivityStart--;
@@ -2970,7 +2950,7 @@ public final class ActivityManagerService extends ActivityManagerNative
            // clean it up now.
            if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG, "App died: " + app);
            checkTime(startTime, "startProcess: bad proc running, killing");
            killProcessGroup(app.info.uid, app.pid);
            Process.killProcessGroup(app.info.uid, app.pid);
            handleAppDiedLocked(app, true, true);
            checkTime(startTime, "startProcess: done killing old proc");
        }
@@ -4855,7 +4835,7 @@ public final class ActivityManagerService extends ActivityManagerNative
            if (!fromBinderDied) {
                Process.killProcessQuiet(pid);
            }
            killProcessGroup(app.info.uid, pid);
            Process.killProcessGroup(app.info.uid, pid);
            app.killed = true;
        }
@@ -12358,7 +12338,7 @@ public final class ActivityManagerService extends ActivityManagerNative
                            } else {
                                // Huh.
                                Process.killProcess(pid);
                                killProcessGroup(uid, pid);
                                Process.killProcessGroup(uid, pid);
                            }
                        }
                        return;
@@ -17270,24 +17250,6 @@ public final class ActivityManagerService extends ActivityManagerNative
        }
    }
    static final boolean DEBUG_KILL_ASYNC = true;
    static public void killProcessGroup(final int uid , final int pid) {
        if (mKillProcessHandler == null) {
            Slog.w(TAG, "thread for killProcessGroup is not ready");
            Process.killProcessGroup(uid, pid);
            return;
        }
        mKillProcessHandler.sendMessage(mKillProcessHandler.obtainMessage(KILL_PROCESS_GROUP_MSG, uid, pid));
    }
    private void killProcessGroupBackground(int uid , int pid) {
        long now = SystemClock.uptimeMillis();
        Process.killProcessGroup(uid, pid);
        if (DEBUG_KILL_ASYNC) Slog.v(TAG, "killProcessGroupAsync took "
            + (SystemClock.uptimeMillis() - now) + " ms for PID " + pid
            + " on thread " + Thread.currentThread().getId());
    }
    private final int computeOomAdjLocked(ProcessRecord app, int cachedAdj, ProcessRecord TOP_APP,
            boolean doingAll, long now) {
        if (mAdjSeq == app.adjSeq) {
+1 −1
Original line number Diff line number Diff line
@@ -529,7 +529,7 @@ final class ProcessRecord {
            }
            EventLog.writeEvent(EventLogTags.AM_KILL, userId, pid, processName, setAdj, reason);
            Process.killProcessQuiet(pid);
            ActivityManagerService.killProcessGroup(this.info.uid, this.pid);
            Process.killProcessGroup(info.uid, pid);
            if (!persistent) {
                killed = true;
                killedByAm = true;