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

Commit ceab3a6e authored by Lakshman Annadorai's avatar Lakshman Annadorai Committed by Cherrypicker Worker
Browse files

Monitor CPU availability using CPU frequency stats.

- Implement the core CPU availability monitoring logic by reading
  the CPU infos with CpuInfoReader.
- Start debug monitoring on user-debug and eng builds when no
  callbacks are registered.
- Update CpuAvailabilityInfo to cache the uptime of the cached data.
- Update CpuAvailabilityMonitoringConfig to return cpuset string.

Test: atest CpuMonitorServiceTest
Bug: 242722241
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:1a18fd0962728468830cc2f2752c1ede3e0c1473)
Merged-In: I6e12c11f243966914079f54df4430d69b797ec1f
Change-Id: I6e12c11f243966914079f54df4430d69b797ec1f
parent aabb81ec
Loading
Loading
Loading
Loading
+50 −13
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import static com.android.server.cpu.CpuAvailabilityMonitoringConfig.CPUSET_BACK

import com.android.internal.util.Preconditions;

import java.util.Objects;

/** CPU availability information. */
public final class CpuAvailabilityInfo {
    /** Constant to indicate missing CPU availability percent. */
@@ -35,29 +37,64 @@ public final class CpuAvailabilityInfo {
    @CpuAvailabilityMonitoringConfig.Cpuset
    public final int cpuset;

    /** Uptime (in milliseconds) when the data in this object was captured. */
    public final long dataTimestampUptimeMillis;

    /** The latest average CPU availability percent. */
    public final int latestAvgAvailabilityPercent;

    /** The past N-second average CPU availability percent. */
    public final int pastNSecAvgAvailabilityPercent;
    /**
     * The past N-millisecond average CPU availability percent.
     *
     * <p>When there is not enough data to calculate the past N-millisecond average, this field will
     * contain the value {@link MISSING_CPU_AVAILABILITY_PERCENT}.
     */
    public final int pastNMillisAvgAvailabilityPercent;

    /** The duration over which the {@link pastNSecAvgAvailabilityPercent} was calculated. */
    public final int avgAvailabilityDurationSec;
    /** The duration over which the {@link pastNMillisAvgAvailabilityPercent} was calculated. */
    public final long pastNMillisDuration;

    @Override
    public String toString() {
        return "CpuAvailabilityInfo{" + "cpuset=" + cpuset + ", latestAvgAvailabilityPercent="
                + latestAvgAvailabilityPercent + ", pastNSecAvgAvailabilityPercent="
                + pastNSecAvgAvailabilityPercent + ", avgAvailabilityDurationSec="
                + avgAvailabilityDurationSec + '}';
        return "CpuAvailabilityInfo{" + "cpuset = " + cpuset + ", dataTimestampUptimeMillis = "
                + dataTimestampUptimeMillis + ", latestAvgAvailabilityPercent = "
                + latestAvgAvailabilityPercent + ", pastNMillisAvgAvailabilityPercent = "
                + pastNMillisAvgAvailabilityPercent + ", pastNMillisDuration = "
                + pastNMillisDuration + '}';
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof CpuAvailabilityInfo)) {
            return false;
        }
        CpuAvailabilityInfo info = (CpuAvailabilityInfo) obj;
        return cpuset == info.cpuset && dataTimestampUptimeMillis == info.dataTimestampUptimeMillis
                && latestAvgAvailabilityPercent == info.latestAvgAvailabilityPercent
                && pastNMillisAvgAvailabilityPercent == info.pastNMillisAvgAvailabilityPercent
                && pastNMillisDuration == info.pastNMillisDuration;
    }

    @Override
    public int hashCode() {
        return Objects.hash(cpuset, dataTimestampUptimeMillis, latestAvgAvailabilityPercent,
                pastNMillisAvgAvailabilityPercent, pastNMillisDuration);
    }

    CpuAvailabilityInfo(int cpuset, int latestAvgAvailabilityPercent,
            int pastNSecAvgAvailabilityPercent, int avgAvailabilityDurationSec) {
    CpuAvailabilityInfo(int cpuset, long dataTimestampUptimeMillis,
            int latestAvgAvailabilityPercent, int pastNMillisAvgAvailabilityPercent,
            long pastNMillisDuration) {
        this.cpuset = Preconditions.checkArgumentInRange(cpuset, CPUSET_ALL, CPUSET_BACKGROUND,
                "cpuset");
        this.latestAvgAvailabilityPercent = latestAvgAvailabilityPercent;
        this.pastNSecAvgAvailabilityPercent = pastNSecAvgAvailabilityPercent;
        this.avgAvailabilityDurationSec = avgAvailabilityDurationSec;
        this.dataTimestampUptimeMillis =
                Preconditions.checkArgumentNonnegative(dataTimestampUptimeMillis);
        this.latestAvgAvailabilityPercent = Preconditions.checkArgumentNonnegative(
                latestAvgAvailabilityPercent);
        this.pastNMillisAvgAvailabilityPercent = pastNMillisAvgAvailabilityPercent;
        this.pastNMillisDuration = Preconditions.checkArgumentNonnegative(
                pastNMillisDuration);
    }
}
+13 −2
Original line number Diff line number Diff line
@@ -90,8 +90,19 @@ public final class CpuAvailabilityMonitoringConfig {

    @Override
    public String toString() {
        return "CpuAvailabilityMonitoringConfig{cpuset=" + cpuset + ", mThresholds=" + mThresholds
                + ')';
        return "CpuAvailabilityMonitoringConfig{cpuset=" + toCpusetString(cpuset) + ", mThresholds="
                + mThresholds + ')';
    }

    /** Returns the string equivalent of the provided cpuset. */
    public static String toCpusetString(int cpuset) {
        switch (cpuset) {
            case CPUSET_ALL:
                return "CPUSET_ALL";
            case CPUSET_BACKGROUND:
                return "CPUSET_BACKGROUND";
        }
        return "Invalid cpuset: " + cpuset;
    }

    private CpuAvailabilityMonitoringConfig(Builder builder) {
+354 −39

File changed.

Preview size limit exceeded, changes collapsed.