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

Commit 4dafb931 authored by Shin Kawamura's avatar Shin Kawamura Committed by Gerrit Code Review
Browse files

Merge "fs_mgr: Skip zram setup on swapon_all if mmd zram management is enabled" into main

parents 2d69dd60 1d4dc2f4
Loading
Loading
Loading
Loading
+82 −0
Original line number Diff line number Diff line
@@ -2023,6 +2023,84 @@ static bool PrepareZramBackingDevice(off64_t size) {
    return InstallZramDevice(loop_device);
}

// Check whether it is in recovery mode or not.
//
// This is a copy from util.h in libinit.
//
// You need to check ALL relevant executables calling this function has access to
// "/system/bin/recovery" (including SELinux permissions and UNIX permissions).
static bool IsRecovery() {
    return access("/system/bin/recovery", F_OK) == 0;
}

// Decides whether swapon_all should skip setting up zram.
//
// swapon_all is deprecated to setup zram after mmd is launched. swapon_all command should skip
// setting up zram if mmd is enabled by AConfig flag and mmd is configured to set up zram.
static bool ShouldSkipZramSetup() {
    if (IsRecovery()) {
        // swapon_all continue to support zram setup in recovery mode after mmd launch.
        return false;
    }

    // Since AConfig does not support to load the status from init, we use the system property
    // "mmd.enabled_aconfig" copied from AConfig by `mmd --set-property` command to check whether
    // mmd is enabled or not.
    //
    // aconfig_prop can have either of:
    //
    // * "true": mmd is enabled by AConfig
    // * "false": mmd is disabled by AConfig
    // * "": swapon_all is executed before `mmd --set-property`
    //
    // During mmd being launched, we request OEMs, who decided to use mmd to set up zram, to execute
    // swapon_all after "mmd.enabled_aconfig" system property is initialized. Init can wait the
    // "mmd.enabled_aconfig" initialization by `property:mmd.enabled_aconfig=*` trigger.
    //
    // After mmd is launched, we deprecate swapon_all command for setting up zram but recommend to
    // use `mmd --setup-zram`. It means that the system should call swapon_all with fstab with no
    // zram entry or the system should never call swapon_all.
    //
    // As a transition, OEMs can use the deprecated swapon_all to set up zram for several versions
    // after mmd is launched. swapon_all command will show warning logs during the transition
    // period.
    const std::string aconfig_prop = android::base::GetProperty("mmd.enabled_aconfig", "");
    const bool is_zram_managed_by_mmd = android::base::GetBoolProperty("mmd.zram.enabled", false);
    if (aconfig_prop == "true" && is_zram_managed_by_mmd) {
        // Skip zram setup since zram is managed by mmd.
        //
        // We expect swapon_all is not called when mmd is enabled by AConfig flag.
        // TODO: b/394484720 - Make this log as warning after mmd is launched.
        LINFO << "Skip setting up zram because mmd sets up zram instead.";
        return true;
    }

    if (aconfig_prop == "false") {
        // It is expected to swapon_all command to set up zram before mmd is launched.
        LOG(DEBUG) << "mmd is not launched yet. swapon_all setup zram.";
    } else if (is_zram_managed_by_mmd) {
        // This branch is for aconfig_prop == ""

        // On the system which uses mmd to setup zram, swapon_all must be executed after
        // mmd.enabled_aconfig is initialized.
        LERROR << "swapon_all must be called after mmd.enabled_aconfig system "
                  "property is initialized";
        // Since we don't know whether mmd is enabled on the system or not, we fall back to enable
        // zram from swapon_all conservatively. Both swapon_all and `mmd --setup-zram` command
        // trying to set up zram does not break the system but just either ends up failing.
    } else {
        // We show the warning log for swapon_all deprecation on both aconfig_prop is "true" and ""
        // cases.
        // If mmd is enabled, swapon_all is already deprecated.
        // If aconfig_prop is "", we don't know whether mmd is launched or not. But we show the
        // deprecation warning log conservatively.
        LWARNING << "mmd is recommended to set up zram over swapon_all command with "
                    "fstab entry.";
    }

    return false;
}

bool fs_mgr_swapon_all(const Fstab& fstab) {
    bool ret = true;
    for (const auto& entry : fstab) {
@@ -2032,6 +2110,10 @@ bool fs_mgr_swapon_all(const Fstab& fstab) {
        }

        if (entry.zram_size > 0) {
            if (ShouldSkipZramSetup()) {
                continue;
            }

            if (!PrepareZramBackingDevice(entry.zram_backingdev_size)) {
                LERROR << "Failure of zram backing device file for '" << entry.blk_device << "'";
            }
+10 −0
Original line number Diff line number Diff line
@@ -785,6 +785,16 @@ provides the `aidl_lazy_test_1` interface.
  fstab.${ro.hardware} or fstab.${ro.hardware.platform} will be scanned for
  under /odm/etc, /vendor/etc, or / at runtime, in that order.

> swapon_all is deprecated and will do nothing if `mmd_enabled` AConfig flag
  in `system_performance` namespace and `mmd.zram.enabled` sysprop are enabled.
  OEMs, who decided to use mmd to manage zram, must remove zram entry from fstab
  or remove swapon_all call from their init script.

> swapon_all continues to support setting up non-zram swap devices.

> swapon_all on recovery mode continues to support setting up zram because mmd
  does not support the recovery mode.

`swapoff <path>`
> Stops swapping to the file or block device specified by path.