From 97f62bf61db50288d3057127ea184b0937437df9 Mon Sep 17 00:00:00 2001 From: Siddharth Ray Date: Sun, 17 Jun 2018 18:28:44 -0700 Subject: Fix in Wifi activity updates When Wifi firmware resets link layer stats, it sometimes returns a value for On time which is much larger than the duration of the report. On time = Idle time + Rx time + Tx time. This change prevents those errors from affecting Wifi power metrics. BUG:110325882 Test: adb shell dumpsys batterystats WiFi Scan time: 12s 302ms WiFi Idle time: 5m 48s 634ms WiFi Rx time: 24s 232ms WiFi Tx time: 10s 510ms Change-Id: I7b69fc728b275f89154dd0c1d7382576ebfadc29 --- .../server/am/BatteryExternalStatsWorker.java | 25 ++++++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java index 49fa902d161d..9eb22d717850 100644 --- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java +++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java @@ -543,14 +543,25 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { final long idleTimeMs = latest.mControllerIdleTimeMs - lastIdleMs; final long scanTimeMs = latest.mControllerScanTimeMs - lastScanMs; - if (txTimeMs < 0 || rxTimeMs < 0 || scanTimeMs < 0) { + if (txTimeMs < 0 || rxTimeMs < 0 || scanTimeMs < 0 || idleTimeMs < 0) { // The stats were reset by the WiFi system (which is why our delta is negative). - // Returns the unaltered stats. - delta.mControllerEnergyUsed = latest.mControllerEnergyUsed; - delta.mControllerRxTimeMs = latest.mControllerRxTimeMs; - delta.mControllerTxTimeMs = latest.mControllerTxTimeMs; - delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs; - delta.mControllerScanTimeMs = latest.mControllerScanTimeMs; + // Returns the unaltered stats. The total on time should not exceed the time + // duartion between reports. + final long totalOnTimeMs = latest.mControllerTxTimeMs + latest.mControllerRxTimeMs + + latest.mControllerIdleTimeMs; + if (totalOnTimeMs <= timePeriodMs + MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS) { + delta.mControllerEnergyUsed = latest.mControllerEnergyUsed; + delta.mControllerRxTimeMs = latest.mControllerRxTimeMs; + delta.mControllerTxTimeMs = latest.mControllerTxTimeMs; + delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs; + delta.mControllerScanTimeMs = latest.mControllerScanTimeMs; + } else { + delta.mControllerEnergyUsed = 0; + delta.mControllerRxTimeMs = 0; + delta.mControllerTxTimeMs = 0; + delta.mControllerIdleTimeMs = 0; + delta.mControllerScanTimeMs = 0; + } Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta); } else { final long totalActiveTimeMs = txTimeMs + rxTimeMs; -- cgit v1.2.3-59-g8ed1b