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

Commit 71768355 authored by Marco Ballesio's avatar Marco Ballesio Committed by Android (Google) Code Review
Browse files

Merge changes from topic "cgroup v2 freezer frameworks" into rvc-qpr-dev

* changes:
  freezer: reentrant enable/disable method
  freezer: switch to cgroup v2 freezer
parents 92d9af6c 12f3e8d6
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -684,4 +684,14 @@ interface IActivityManager {
     * Kills uid with the reason of permission change.
     */
    void killUidForPermissionChange(int appId, int userId, String reason);

    /**
     * Control the app freezer state. Returns true in case of success, false if the operation
     * didn't succeed (for example, when the app freezer isn't supported). 
     * Handling the freezer state via this method is reentrant, that is it can be 
     * disabled and re-enabled multiple times in parallel. As long as there's a 1:1 disable to
     * enable match, the freezer is re-enabled at last enable only.
     * @param enable set it to true to enable the app freezer, false to disable it.
     */
    boolean enableAppFreezer(in boolean enable);
}
+12 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.os;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.util.Log;
import android.util.SparseIntArray;
@@ -255,7 +256,12 @@ public final class BinderProxy implements IBinder {
            // out of system_server to all processes hosting binder objects it holds a reference to;
            // since some of those processes might be frozen, we don't want to block here
            // forever. Disable the freezer.
            Process.enableFreezer(false);
            try {
                ActivityManager.getService().enableAppFreezer(false);
            } catch (RemoteException e) {
                Log.e(Binder.TAG, "RemoteException while disabling app freezer");
            }

            for (WeakReference<BinderProxy> weakRef : proxiesToQuery) {
                BinderProxy bp = weakRef.get();
                String key;
@@ -278,7 +284,11 @@ public final class BinderProxy implements IBinder {
                    counts.put(key, i + 1);
                }
            }
            Process.enableFreezer(true);
            try {
                ActivityManager.getService().enableAppFreezer(true);
            } catch (RemoteException e) {
                Log.e(Binder.TAG, "RemoteException while re-enabling app freezer");
            }
            Map.Entry<String, Integer>[] sorted = counts.entrySet().toArray(
                    new Map.Entry[counts.size()]);

+1 −1
Original line number Diff line number Diff line
@@ -947,7 +947,7 @@ public class Process {

    /**
     * Enable or disable the freezer. When enable == false all frozen processes are unfrozen,
     * but aren't removed from the freezer. Processes can still be added or removed
     * but aren't removed from the freezer. While in this state, processes can be added or removed
     * by using setProcessFrozen, but they won't actually be frozen until the freezer is enabled
     * again. If enable == true the freezer is enabled again, and all processes
     * in the freezer (including the ones added while the freezer was disabled) are frozen.
+0 −17
Original line number Diff line number Diff line
@@ -346,22 +346,6 @@ void android_os_Process_setProcessFrozen(
    }
}

void android_os_Process_enableFreezer(
        JNIEnv *env, jobject clazz, jboolean enable)
{
    bool success = true;

    if (enable) {
        success = SetTaskProfiles(0, {"FreezerFrozen"}, true);
    } else {
        success = SetTaskProfiles(0, {"FreezerThawed"}, true);
    }

    if (!success) {
        jniThrowException(env, "java/lang/RuntimeException", "Unknown error");
    }
}

jint android_os_Process_getProcessGroup(JNIEnv* env, jobject clazz, jint pid)
{
    SchedPolicy sp;
@@ -1360,7 +1344,6 @@ static const JNINativeMethod methods[] = {
        {"sendSignal", "(II)V", (void*)android_os_Process_sendSignal},
        {"sendSignalQuiet", "(II)V", (void*)android_os_Process_sendSignalQuiet},
        {"setProcessFrozen", "(IIZ)V", (void*)android_os_Process_setProcessFrozen},
        {"enableFreezer", "(Z)V", (void*)android_os_Process_enableFreezer},
        {"getFreeMemory", "()J", (void*)android_os_Process_getFreeMemory},
        {"getTotalMemory", "()J", (void*)android_os_Process_getTotalMemory},
        {"readProcLines", "(Ljava/lang/String;[Ljava/lang/String;[J)V",
+22 −26
Original line number Diff line number Diff line
@@ -2218,17 +2218,13 @@ public class ActivityManagerService extends IActivityManager.Stub
        @Override
        protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
            try {
                if (mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.useFreezer()) {
                    Process.enableFreezer(false);
                }
                mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.enableFreezer(false);
                if (!DumpUtils.checkDumpAndUsageStatsPermission(mActivityManagerService.mContext,
                        "meminfo", pw)) return;
                PriorityDump.dump(mPriorityDumper, fd, pw, args);
            } finally {
                if (mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.useFreezer()) {
                    Process.enableFreezer(true);
                }
                mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.enableFreezer(true);
            }
        }
    }
@@ -2242,17 +2238,13 @@ public class ActivityManagerService extends IActivityManager.Stub
        @Override
        protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
            try {
                if (mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.useFreezer()) {
                    Process.enableFreezer(false);
                }
                mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.enableFreezer(false);
                if (!DumpUtils.checkDumpAndUsageStatsPermission(mActivityManagerService.mContext,
                        "gfxinfo", pw)) return;
                mActivityManagerService.dumpGraphicsHardwareUsage(fd, pw, args);
            } finally {
                if (mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.useFreezer()) {
                    Process.enableFreezer(true);
                }
                mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.enableFreezer(true);
            }
        }
    }
@@ -2266,17 +2258,13 @@ public class ActivityManagerService extends IActivityManager.Stub
        @Override
        protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
            try {
                if (mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.useFreezer()) {
                    Process.enableFreezer(false);
                }
                mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.enableFreezer(false);
                if (!DumpUtils.checkDumpAndUsageStatsPermission(mActivityManagerService.mContext,
                        "dbinfo", pw)) return;
                mActivityManagerService.dumpDbInfo(fd, pw, args);
            } finally {
                if (mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.useFreezer()) {
                    Process.enableFreezer(true);
                }
                mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.enableFreezer(true);
            }
        }
    }
@@ -2322,9 +2310,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        @Override
        protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
            try {
                if (mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.useFreezer()) {
                    Process.enableFreezer(false);
                }
                mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.enableFreezer(false);
                if (!DumpUtils.checkDumpAndUsageStatsPermission(mActivityManagerService.mContext,
                        "cacheinfo", pw)) {
@@ -2333,9 +2319,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                mActivityManagerService.dumpBinderCacheContents(fd, pw, args);
            } finally {
                if (mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.useFreezer()) {
                    Process.enableFreezer(true);
                }
                mActivityManagerService.mOomAdjuster.mCachedAppOptimizer.enableFreezer(true);
            }
        }
    }
@@ -18630,14 +18614,14 @@ public class ActivityManagerService extends IActivityManager.Stub
                    }
                }
                Process.enableFreezer(false);
                mOomAdjuster.mCachedAppOptimizer.enableFreezer(false);
                final RemoteCallback intermediateCallback = new RemoteCallback(
                        new RemoteCallback.OnResultListener() {
                        @Override
                        public void onResult(Bundle result) {
                            finishCallback.sendResult(result);
                            Process.enableFreezer(true);
                            mOomAdjuster.mCachedAppOptimizer.enableFreezer(true);
                        }
                    }, null);
@@ -20399,4 +20383,16 @@ public class ActivityManagerService extends IActivityManager.Stub
            Binder.restoreCallingIdentity(token);
        }
    }
    @Override
    public boolean enableAppFreezer(boolean enable) {
        int callerUid = Binder.getCallingUid();
        // Only system can toggle the freezer state
        if (callerUid == SYSTEM_UID) {
            return mOomAdjuster.mCachedAppOptimizer.enableFreezer(enable);
        } else {
            throw new SecurityException("Caller uid " + callerUid + " cannot set freezer state ");
        }
    }
}
Loading