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

Commit 922617d8 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Fix CPU active time counter for isolated UIDs

Bug: 204087731
Test: atest FrameworksCoreTests:BatteryStatsTests
Change-Id: Ia7bd13aecd9c7c7321d1c6d6ea99beaed60f7e90
parent d02be97a
Loading
Loading
Loading
Loading
+65 −24
Original line number Diff line number Diff line
@@ -491,7 +491,8 @@ public class BatteryStatsImpl extends BatteryStats {
                    isolatedUidTimeInFreqCounters = new LongArrayMultiStateCounter[childUidCount];
                    for (int j = childUidCount - 1; j >= 0; --j) {
                        isolatedUids[j] = u.mChildUids.keyAt(j);
                        isolatedUidTimeInFreqCounters[j] = u.mChildUids.valueAt(j);
                        isolatedUidTimeInFreqCounters[j] =
                                u.mChildUids.valueAt(j).cpuTimeInFreqCounter;
                    }
                }
            }
@@ -574,7 +575,8 @@ public class BatteryStatsImpl extends BatteryStats {
            }
            for (int i = allUidCpuFreqTimesMs.size() - 1; i >= 0; --i) {
                final int uid = allUidCpuFreqTimesMs.keyAt(i);
                final Uid u = getAvailableUidStatsLocked(mapUid(uid));
                final int parentUid = mapUid(uid);
                final Uid u = getAvailableUidStatsLocked(parentUid);
                if (u == null) {
                    continue;
                }
@@ -599,16 +601,22 @@ public class BatteryStatsImpl extends BatteryStats {
                        u.getProcStateScreenOffTimeCounter().getCounter();
                onBatteryCounter.setState(procState, timestampMs);
                if (uid == parentUid) {
                    mKernelSingleUidTimeReader.addDelta(uid, onBatteryCounter, timestampMs);
                }
                onBatteryScreenOffCounter.setState(procState, timestampMs);
                mKernelSingleUidTimeReader.addDelta(uid, onBatteryScreenOffCounter, timestampMs);
                if (uid == parentUid) {
                    mKernelSingleUidTimeReader.addDelta(uid, onBatteryScreenOffCounter,
                            timestampMs);
                }
                if (u.mChildUids != null) {
                    final LongArrayMultiStateCounter.LongArrayContainer deltaContainer =
                            new LongArrayMultiStateCounter.LongArrayContainer(getCpuFreqCount());
                    for (int j = u.mChildUids.size() - 1; j >= 0; --j) {
                        final LongArrayMultiStateCounter counter = u.mChildUids.valueAt(j);
                        final LongArrayMultiStateCounter counter =
                                u.mChildUids.valueAt(j).cpuTimeInFreqCounter;
                        if (counter != null) {
                            final int isolatedUid = u.mChildUids.keyAt(j);
                            mKernelSingleUidTimeReader.addDelta(isolatedUid,
@@ -1836,8 +1844,12 @@ public class BatteryStatsImpl extends BatteryStats {
            mCounter.setState(processState, elapsedRealtimeMs);
        }
        private void update(long value, long timestampMs) {
            mCounter.updateValue(value, timestampMs);
        private long update(long value, long timestampMs) {
            return mCounter.updateValue(value, timestampMs);
        }
        public void addCount(long delta) {
            mCounter.addCount(delta);
        }
        /**
@@ -8116,7 +8128,7 @@ public class BatteryStatsImpl extends BatteryStats {
        TimeInFreqMultiStateCounter mProcStateTimeMs;
        TimeInFreqMultiStateCounter mProcStateScreenOffTimeMs;
        SparseArray<LongArrayMultiStateCounter> mChildUids;
        SparseArray<ChildUid> mChildUids;
        /**
         * The statistics we have collected for this uid's wake locks.
@@ -8386,18 +8398,7 @@ public class BatteryStatsImpl extends BatteryStats {
            } else if (mChildUids.indexOfKey(isolatedUid) >= 0) {
                return;
            }
            if (mBsi.trackPerProcStateCpuTimes()) {
                LongArrayMultiStateCounter counter =
                        new LongArrayMultiStateCounter(1, mBsi.getCpuFreqCount());
                // Set initial values to all 0. This is a child UID and we want to include
                // the entirety of its CPU time-in-freq stats into the parent's stats.
                counter.updateValues(
                        new LongArrayMultiStateCounter.LongArrayContainer(mBsi.getCpuFreqCount()),
                        mBsi.mClock.elapsedRealtime());
                mChildUids.put(isolatedUid, counter);
            } else {
                mChildUids.put(isolatedUid, null);
            }
            mChildUids.put(isolatedUid, new ChildUid());
        }
        public void removeIsolatedUid(int isolatedUid) {
@@ -11196,6 +11197,32 @@ public class BatteryStatsImpl extends BatteryStats {
            }
        }
        private class ChildUid {
            public final TimeMultiStateCounter cpuActiveCounter;
            public final LongArrayMultiStateCounter cpuTimeInFreqCounter;
            ChildUid() {
                final long timestampMs = mBsi.mClock.elapsedRealtime();
                cpuActiveCounter =
                        new TimeMultiStateCounter(mBsi.mOnBatteryTimeBase, 1, timestampMs);
                cpuActiveCounter.setState(0, timestampMs);
                if (mBsi.trackPerProcStateCpuTimes()) {
                    final int cpuFreqCount = mBsi.getCpuFreqCount();
                    cpuTimeInFreqCounter = new LongArrayMultiStateCounter(1, cpuFreqCount);
                    // Set initial values to all 0. This is a child UID and we want to include
                    // the entirety of its CPU time-in-freq stats into the parent's stats.
                    cpuTimeInFreqCounter.updateValues(
                            new LongArrayMultiStateCounter.LongArrayContainer(cpuFreqCount),
                            timestampMs);
                } else {
                    cpuTimeInFreqCounter = null;
                }
            }
        }
        /**
         * Retrieve the statistics object for a particular process, creating
         * if needed.
@@ -14474,8 +14501,8 @@ public class BatteryStatsImpl extends BatteryStats {
        final long startTimeMs = mClock.uptimeMillis();
        final long elapsedRealtimeMs = mClock.elapsedRealtime();
        mCpuUidActiveTimeReader.readAbsolute((uid, cpuActiveTimesMs) -> {
            uid = mapUid(uid);
            if (Process.isIsolated(uid)) {
            final int parentUid = mapUid(uid);
            if (Process.isIsolated(parentUid)) {
                if (DEBUG) Slog.w(TAG, "Got active times for an isolated uid: " + uid);
                return;
            }
@@ -14483,8 +14510,22 @@ public class BatteryStatsImpl extends BatteryStats {
                if (DEBUG) Slog.w(TAG, "Got active times for an invalid user's uid " + uid);
                return;
            }
            final Uid u = getUidStatsLocked(uid, elapsedRealtimeMs, startTimeMs);
            u.getCpuActiveTimeCounter().update(cpuActiveTimesMs, mClock.elapsedRealtime());
            final Uid u = getUidStatsLocked(parentUid, elapsedRealtimeMs, startTimeMs);
            if (parentUid == uid) {
                u.getCpuActiveTimeCounter().update(cpuActiveTimesMs, elapsedRealtimeMs);
            } else {
                final SparseArray<Uid.ChildUid> childUids = u.mChildUids;
                if (childUids == null) {
                    return;
                }
                Uid.ChildUid childUid = childUids.get(uid);
                if (childUid != null) {
                    final long delta =
                            childUid.cpuActiveCounter.update(cpuActiveTimesMs, elapsedRealtimeMs);
                    u.getCpuActiveTimeCounter().addCount(delta);
                }
            }
        });
        final long elapsedTimeMs = mClock.uptimeMillis() - startTimeMs;
+7 −5
Original line number Diff line number Diff line
@@ -109,12 +109,14 @@ public final class LongMultiStateCounter implements Parcelable {
    }

    /**
     * Sets the new values.  The delta between the previously set values and these values
     * Sets the new values.  The delta between the previously set value and this value
     * is distributed among the state according to the time the object spent in those states
     * since the previous call to updateValues.
     * since the previous call to updateValue.
     *
     * @return The delta between the previous value and the new value.
     */
    public void updateValue(long value, long timestampMs) {
        native_updateValue(mNativeObject, value, timestampMs);
    public long updateValue(long value, long timestampMs) {
        return native_updateValue(mNativeObject, value, timestampMs);
    }

    /**
@@ -185,7 +187,7 @@ public final class LongMultiStateCounter implements Parcelable {
    private static native void native_setState(long nativeObject, int state, long timestampMs);

    @CriticalNative
    private static native void native_updateValue(long nativeObject, long value, long timestampMs);
    private static native long native_updateValue(long nativeObject, long value, long timestampMs);

    @CriticalNative
    private static native void native_addCount(long nativeObject, long count);
+3 −3
Original line number Diff line number Diff line
@@ -80,8 +80,8 @@ static void native_setState(jlong nativePtr, jint state, jlong timestamp) {
    asLongMultiStateCounter(nativePtr)->setState(state, timestamp);
}

static void native_updateValue(jlong nativePtr, jlong value, jlong timestamp) {
    asLongMultiStateCounter(nativePtr)->updateValue((int64_t)value, timestamp);
static jlong native_updateValue(jlong nativePtr, jlong value, jlong timestamp) {
    return (jlong)asLongMultiStateCounter(nativePtr)->updateValue((int64_t)value, timestamp);
}

static void native_addCount(jlong nativePtr, jlong count) {
@@ -170,7 +170,7 @@ static const JNINativeMethod g_methods[] = {
        // @CriticalNative
        {"native_setState", "(JIJ)V", (void *)native_setState},
        // @CriticalNative
        {"native_updateValue", "(JJJ)V", (void *)native_updateValue},
        {"native_updateValue", "(JJJ)J", (void *)native_updateValue},
        // @CriticalNative
        {"native_addCount", "(JJ)V", (void *)native_addCount},
        // @CriticalNative