From 37ae22f321320ce43452667652b56e8a032948f0 Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Mon, 1 Jun 2020 11:12:54 -0700 Subject: [PATCH] freezer: switch to cgroup v2 freezer cgroup v2 freezer has a single hierarchy and is mounted under /sys/fs/cgroup. Proper v2 freezer support in a system can be checked by verifying that the file "cgroup.freeze" is present in a freezer subgroup. Bug: 154548692 Test: manually verified that processes are frozen and unfrozen Change-Id: Ib966a957490ec986eb14aba6492832c96e147896 --- core/java/android/os/Process.java | 2 +- core/jni/android_util_Process.cpp | 4 ++-- .../android/server/am/CachedAppOptimizer.java | 18 +++++++++++------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index a4077fbee892e..efea9537c4cfe 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -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. diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index cbcbe7f113903..7036e9a6d5b0c 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -378,9 +378,9 @@ void android_os_Process_enableFreezer( bool success = true; if (enable) { - success = SetTaskProfiles(0, {"FreezerFrozen"}, true); + success = SetTaskProfiles(0, {"FreezerEnabled"}, true); } else { - success = SetTaskProfiles(0, {"FreezerThawed"}, true); + success = SetTaskProfiles(0, {"FreezerDisabled"}, true); } if (!success) { diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index d9fde0f6728a8..ce7c73a5d8a31 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -420,25 +420,25 @@ public final class CachedAppOptimizer { } /** - * Determines whether the freezer is correctly supported by this system + * Determines whether the freezer is supported by this system */ public static boolean isFreezerSupported() { boolean supported = false; FileReader fr = null; try { - fr = new FileReader("/dev/freezer/frozen/freezer.killable"); - int i = fr.read(); + fr = new FileReader("/sys/fs/cgroup/freezer/cgroup.freeze"); + char state = (char) fr.read(); - if ((char) i == '1') { + if (state == '1' || state == '0') { supported = true; } else { - Slog.w(TAG_AM, "Freezer killability is turned off, disabling freezer"); + Slog.e(TAG_AM, "unexpected value in cgroup.freeze"); } } catch (java.io.FileNotFoundException e) { - Slog.d(TAG_AM, "Freezer.killable not present, disabling freezer"); + Slog.d(TAG_AM, "cgroup.freeze not present"); } catch (Exception e) { - Slog.d(TAG_AM, "Unable to read freezer.killable, disabling freezer: " + e.toString()); + Slog.d(TAG_AM, "unable to read cgroup.freeze: " + e.toString()); } if (fr != null) { @@ -471,6 +471,8 @@ public final class CachedAppOptimizer { if (mUseFreezer && mFreezeHandler == null) { Slog.d(TAG_AM, "Freezer enabled"); + Process.enableFreezer(true); + if (!mCachedAppOptimizerThread.isAlive()) { mCachedAppOptimizerThread.start(); } @@ -479,6 +481,8 @@ public final class CachedAppOptimizer { Process.setThreadGroupAndCpuset(mCachedAppOptimizerThread.getThreadId(), Process.THREAD_GROUP_SYSTEM); + } else { + Process.enableFreezer(false); } }