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
Merged-In: Ib966a957490ec986eb14aba6492832c96e147896
This commit is contained in:
Marco Ballesio
2020-06-01 11:12:54 -07:00
parent 45c1b35d20
commit 6ca459dc17
3 changed files with 14 additions and 10 deletions

View File

@@ -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.

View File

@@ -352,9 +352,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) {

View File

@@ -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);
}
}