diff options
3 files changed, 73 insertions, 65 deletions
diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index 6c1166a1d594..1a4a2f132936 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -890,61 +890,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } } - private void pullCpuTimePerThreadFreq(int tagId, long elapsedNanos, long wallClockNanos, - List<StatsLogEventWrapper> pulledData) { - if (this.mKernelCpuThreadReader == null) { - throw new IllegalStateException("mKernelCpuThreadReader is null"); - } - ArrayList<KernelCpuThreadReader.ProcessCpuUsage> processCpuUsages = - this.mKernelCpuThreadReader.getProcessCpuUsageDiffed(); - if (processCpuUsages == null) { - throw new IllegalStateException("processCpuUsages is null"); - } - int[] cpuFrequencies = mKernelCpuThreadReader.getCpuFrequenciesKhz(); - if (cpuFrequencies.length > CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES) { - String message = "Expected maximum " + CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES - + " frequencies, but got " + cpuFrequencies.length; - Slog.w(TAG, message); - throw new IllegalStateException(message); - } - for (int i = 0; i < processCpuUsages.size(); i++) { - KernelCpuThreadReader.ProcessCpuUsage processCpuUsage = processCpuUsages.get(i); - ArrayList<KernelCpuThreadReader.ThreadCpuUsage> threadCpuUsages = - processCpuUsage.threadCpuUsages; - for (int j = 0; j < threadCpuUsages.size(); j++) { - KernelCpuThreadReader.ThreadCpuUsage threadCpuUsage = threadCpuUsages.get(j); - if (threadCpuUsage.usageTimesMillis.length != cpuFrequencies.length) { - String message = "Unexpected number of usage times," - + " expected " + cpuFrequencies.length - + " but got " + threadCpuUsage.usageTimesMillis.length; - Slog.w(TAG, message); - throw new IllegalStateException(message); - } - - StatsLogEventWrapper e = - new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(processCpuUsage.uid); - e.writeInt(processCpuUsage.processId); - e.writeInt(threadCpuUsage.threadId); - e.writeString(processCpuUsage.processName); - e.writeString(threadCpuUsage.threadName); - for (int k = 0; k < CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES; k++) { - if (k < cpuFrequencies.length) { - e.writeInt(cpuFrequencies[k]); - e.writeInt(threadCpuUsage.usageTimesMillis[k]); - } else { - // If we have no more frequencies to write, we still must write empty data. - // We know that this data is empty (and not just zero) because all - // frequencies are expected to be greater than zero - e.writeInt(0); - e.writeInt(0); - } - } - pulledData.add(e); - } - } - } - private void pullDebugElapsedClock(int tagId, long elapsedNanos, final long wallClockNanos, List<StatsLogEventWrapper> pulledData) { final long elapsedMillis = SystemClock.elapsedRealtime(); @@ -1348,10 +1293,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pullProcessCpuTime(tagId, elapsedNanos, wallClockNanos, ret); break; } - case StatsLog.CPU_TIME_PER_THREAD_FREQ: { - pullCpuTimePerThreadFreq(tagId, elapsedNanos, wallClockNanos, ret); - break; - } case StatsLog.DEBUG_ELAPSED_CLOCK: { pullDebugElapsedClock(tagId, elapsedNanos, wallClockNanos, ret); diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index b72de3b9fa39..c62b43564030 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -113,9 +113,6 @@ std::map<PullerKey, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = { {{.atomTag = android::util::PROCESS_CPU_TIME}, {.coolDownNs = 5 * NS_PER_SEC /* min cool-down in seconds*/, .puller = new StatsCompanionServicePuller(android::util::PROCESS_CPU_TIME)}}, - {{.atomTag = android::util::CPU_TIME_PER_THREAD_FREQ}, - {.additiveFields = {7, 9, 11, 13, 15, 17, 19, 21}, - .puller = new StatsCompanionServicePuller(android::util::CPU_TIME_PER_THREAD_FREQ)}}, // DebugElapsedClock. {{.atomTag = android::util::DEBUG_ELAPSED_CLOCK}, diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 8d45b42f9a87..6aa3021d0fb9 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -227,6 +227,10 @@ public class StatsPullAtomService extends SystemService { numSpeedSteps); firstCpuOfCluster += powerProfile.getNumCoresInCpuCluster(i); } + + // Used for CPU_TIME_PER_THREAD_FREQ + mKernelCpuThreadReader = + KernelCpuThreadReaderSettingsObserver.getSettingsModifiedReader(mContext); } @Override @@ -1875,12 +1879,78 @@ public class StatsPullAtomService extends SystemService { // No op. } + @Nullable + private KernelCpuThreadReaderDiff mKernelCpuThreadReader; + private static final int CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES = 8; + private void registerCpuTimePerThreadFreq() { - // No op. + int tagId = StatsLog.CPU_TIME_PER_THREAD_FREQ; + PullAtomMetadata metadata = PullAtomMetadata.newBuilder() + .setAdditiveFields(new int[] {7, 9, 11, 13, 15, 17, 19, 21}) + .build(); + mStatsManager.registerPullAtomCallback( + tagId, + metadata, + (atomTag, data) -> pullCpuTimePerThreadFreq(atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullCpuTimePerThreadFreq() { - // No op. + private int pullCpuTimePerThreadFreq(int atomTag, List<StatsEvent> pulledData) { + if (this.mKernelCpuThreadReader == null) { + Slog.e(TAG, "mKernelCpuThreadReader is null"); + return StatsManager.PULL_SKIP; + } + ArrayList<KernelCpuThreadReader.ProcessCpuUsage> processCpuUsages = + this.mKernelCpuThreadReader.getProcessCpuUsageDiffed(); + if (processCpuUsages == null) { + Slog.e(TAG, "processCpuUsages is null"); + return StatsManager.PULL_SKIP; + } + int[] cpuFrequencies = mKernelCpuThreadReader.getCpuFrequenciesKhz(); + if (cpuFrequencies.length > CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES) { + String message = "Expected maximum " + CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES + + " frequencies, but got " + cpuFrequencies.length; + Slog.w(TAG, message); + return StatsManager.PULL_SKIP; + } + for (int i = 0; i < processCpuUsages.size(); i++) { + KernelCpuThreadReader.ProcessCpuUsage processCpuUsage = processCpuUsages.get(i); + ArrayList<KernelCpuThreadReader.ThreadCpuUsage> threadCpuUsages = + processCpuUsage.threadCpuUsages; + for (int j = 0; j < threadCpuUsages.size(); j++) { + KernelCpuThreadReader.ThreadCpuUsage threadCpuUsage = threadCpuUsages.get(j); + if (threadCpuUsage.usageTimesMillis.length != cpuFrequencies.length) { + String message = "Unexpected number of usage times," + + " expected " + cpuFrequencies.length + + " but got " + threadCpuUsage.usageTimesMillis.length; + Slog.w(TAG, message); + return StatsManager.PULL_SKIP; + } + + StatsEvent.Builder e = StatsEvent.newBuilder(); + e.setAtomId(atomTag); + e.writeInt(processCpuUsage.uid); + e.writeInt(processCpuUsage.processId); + e.writeInt(threadCpuUsage.threadId); + e.writeString(processCpuUsage.processName); + e.writeString(threadCpuUsage.threadName); + for (int k = 0; k < CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES; k++) { + if (k < cpuFrequencies.length) { + e.writeInt(cpuFrequencies[k]); + e.writeInt(threadCpuUsage.usageTimesMillis[k]); + } else { + // If we have no more frequencies to write, we still must write empty data. + // We know that this data is empty (and not just zero) because all + // frequencies are expected to be greater than zero + e.writeInt(0); + e.writeInt(0); + } + } + pulledData.add(e.build()); + } + } + return StatsManager.PULL_SUCCESS; } // TODO: move to top of file when all migrations are complete |