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

Commit 02240482 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov Committed by Android (Google) Code Review
Browse files

Merge "Fix CPU active time counter for isolated UIDs"

parents 8f91e971 922617d8
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