From a31a605797a9ebb1ae95571eaaf1c99b0a7799bf Mon Sep 17 00:00:00 2001 From: Daeho Jeong Date: Thu, 23 Jun 2022 11:32:41 -0700 Subject: [PATCH 1/2] Make smart idle maint update write amount record every period Now, when the condition doesn't meet, smart idle maintenance service doesn't update write amount record. Fixed it, since it should be updated every period. Test: check smart idle maint log of StorageManagerService Signed-off-by: Daeho Jeong Change-Id: I339109fcaa821620a3b9b4b8c49e25fd18d03cf3 --- .../com/android/server/StorageManagerService.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 7cbe218a92340..3b2cd80abdf74 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -2728,6 +2728,14 @@ class StorageManagerService extends IStorageManager.Stub enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS); try { + int latestWrite = mVold.getWriteAmount(); + if (latestWrite == -1) { + Slog.w(TAG, "Failed to get storage write record"); + return; + } + + updateStorageWriteRecords(latestWrite); + // Block based checkpoint process runs fstrim. So, if checkpoint is in progress // (first boot after OTA), We skip the smart idle maintenance if (!needsCheckpoint() || !supportsBlockCheckpoint()) { @@ -2735,13 +2743,6 @@ class StorageManagerService extends IStorageManager.Stub return; } - int latestWrite = mVold.getWriteAmount(); - if (latestWrite == -1) { - Slog.w(TAG, "Failed to get storage write record"); - return; - } - - updateStorageWriteRecords(latestWrite); int avgWriteAmount = getAverageWriteAmount(); Slog.i(TAG, "Set smart idle maintenance: " + "latest write amount: " + From 6fa155f8edbf3198bc0e4c56ef9c1d86cce013c4 Mon Sep 17 00:00:00 2001 From: Daeho Jeong Date: Thu, 23 Jun 2022 16:12:52 -0700 Subject: [PATCH 2/2] Make minimum gc sleep time tunnable Test: check smart idle maint log of StorageManagerService Signed-off-by: Daeho Jeong Change-Id: I004bb6752e84d26b041cfdd27848949f6e49d05e --- .../com/android/server/StorageManagerService.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 3b2cd80abdf74..98b754f44ceae 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -354,6 +354,8 @@ class StorageManagerService extends IStorageManager.Stub private static final float DEFAULT_LOW_BATTERY_LEVEL = 20F; // Decide whether charging is required to turn on the feature private static final boolean DEFAULT_CHARGING_REQUIRED = true; + // Minimum GC interval sleep time in ms + private static final int DEFAULT_MIN_GC_SLEEPTIME = 10000; private volatile int mLifetimePercentThreshold; private volatile int mMinSegmentsThreshold; @@ -361,6 +363,7 @@ class StorageManagerService extends IStorageManager.Stub private volatile float mSegmentReclaimWeight; private volatile float mLowBatteryLevel; private volatile boolean mChargingRequired; + private volatile int mMinGCSleepTime; private volatile boolean mNeedGC; private volatile boolean mPassedLifetimeThresh; @@ -2611,6 +2614,8 @@ class StorageManagerService extends IStorageManager.Stub "low_battery_level", DEFAULT_LOW_BATTERY_LEVEL); mChargingRequired = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_STORAGE_NATIVE_BOOT, "charging_required", DEFAULT_CHARGING_REQUIRED); + mMinGCSleepTime = DeviceConfig.getInt(DeviceConfig.NAMESPACE_STORAGE_NATIVE_BOOT, + "min_gc_sleeptime", DEFAULT_MIN_GC_SLEEPTIME); // If we use the smart idle maintenance, we need to turn off GC in the traditional idle // maintenance to avoid the conflict @@ -2750,9 +2755,11 @@ class StorageManagerService extends IStorageManager.Stub ", min segment threshold: " + mMinSegmentsThreshold + ", dirty reclaim rate: " + mDirtyReclaimRate + ", segment reclaim weight: " + mSegmentReclaimWeight + - ", period: " + sSmartIdleMaintPeriod); + ", period(min): " + sSmartIdleMaintPeriod + + ", min gc sleep time(ms): " + mMinGCSleepTime); mVold.setGCUrgentPace(avgWriteAmount, mMinSegmentsThreshold, mDirtyReclaimRate, - mSegmentReclaimWeight, sSmartIdleMaintPeriod); + mSegmentReclaimWeight, sSmartIdleMaintPeriod, + mMinGCSleepTime); } else { Slog.i(TAG, "Skipping smart idle maintenance - block based checkpoint in progress"); }