Merge "Add API to get remaining lifetime as a percentage." into main

This commit is contained in:
David Anderson 2024-02-01 04:51:03 +00:00 committed by Gerrit Code Review
commit f75d8fc237
5 changed files with 41 additions and 0 deletions

View file

@ -507,6 +507,30 @@ int32_t GetStorageLifeTime() {
return -1; return -1;
} }
int32_t GetStorageRemainingLifetime() {
std::string path = getDevSysfsPath();
if (path.empty()) {
return -1;
}
std::string lifeTimeBasePath = path + "/health_descriptor/life_time_estimation_";
int32_t lifeTime = getLifeTime(lifeTimeBasePath + "c");
if (lifeTime == -1) {
int32_t lifeTimeA = getLifeTime(lifeTimeBasePath + "a");
int32_t lifeTimeB = getLifeTime(lifeTimeBasePath + "b");
lifeTime = std::max(lifeTimeA, lifeTimeB);
if (lifeTime <= 0) {
return -1;
}
// 1 = 0-10% used, 10 = 90-100% used. Subtract 1 so that a brand new
// device looks 0% used.
lifeTime = (lifeTime - 1) * 10;
}
return 100 - std::clamp(lifeTime, 0, 100);
}
void SetGCUrgentPace(int32_t neededSegments, int32_t minSegmentThreshold, float dirtyReclaimRate, void SetGCUrgentPace(int32_t neededSegments, int32_t minSegmentThreshold, float dirtyReclaimRate,
float reclaimWeight, int32_t gcPeriod, int32_t minGCSleepTime, float reclaimWeight, int32_t gcPeriod, int32_t minGCSleepTime,
int32_t targetDirtyRatio) { int32_t targetDirtyRatio) {

View file

@ -26,6 +26,7 @@ void Trim(const android::sp<android::os::IVoldTaskListener>& listener);
int RunIdleMaint(bool needGC, const android::sp<android::os::IVoldTaskListener>& listener); int RunIdleMaint(bool needGC, const android::sp<android::os::IVoldTaskListener>& listener);
int AbortIdleMaint(const android::sp<android::os::IVoldTaskListener>& listener); int AbortIdleMaint(const android::sp<android::os::IVoldTaskListener>& listener);
int32_t GetStorageLifeTime(); int32_t GetStorageLifeTime();
int32_t GetStorageRemainingLifetime();
void SetGCUrgentPace(int32_t neededSegments, int32_t minSegmentThreshold, float dirtyReclaimRate, void SetGCUrgentPace(int32_t neededSegments, int32_t minSegmentThreshold, float dirtyReclaimRate,
float reclaimWeight, int32_t gcPeriod, int32_t minGCSleepTime, float reclaimWeight, int32_t gcPeriod, int32_t minGCSleepTime,
int32_t targetDirtyRatio); int32_t targetDirtyRatio);

View file

@ -504,6 +504,14 @@ binder::Status VoldNativeService::getStorageLifeTime(int32_t* _aidl_return) {
return Ok(); return Ok();
} }
binder::Status VoldNativeService::getStorageRemainingLifetime(int32_t* _aidl_return) {
ENFORCE_SYSTEM_OR_ROOT;
ACQUIRE_LOCK;
*_aidl_return = GetStorageRemainingLifetime();
return Ok();
}
binder::Status VoldNativeService::setGCUrgentPace(int32_t neededSegments, binder::Status VoldNativeService::setGCUrgentPace(int32_t neededSegments,
int32_t minSegmentThreshold, int32_t minSegmentThreshold,
float dirtyReclaimRate, float reclaimWeight, float dirtyReclaimRate, float reclaimWeight,

View file

@ -89,6 +89,7 @@ class VoldNativeService : public BinderService<VoldNativeService>, public os::Bn
const android::sp<android::os::IVoldTaskListener>& listener); const android::sp<android::os::IVoldTaskListener>& listener);
binder::Status abortIdleMaint(const android::sp<android::os::IVoldTaskListener>& listener); binder::Status abortIdleMaint(const android::sp<android::os::IVoldTaskListener>& listener);
binder::Status getStorageLifeTime(int32_t* _aidl_return); binder::Status getStorageLifeTime(int32_t* _aidl_return);
binder::Status getStorageRemainingLifetime(int32_t* _aidl_return);
binder::Status setGCUrgentPace(int32_t neededSegments, int32_t minSegmentThreshold, binder::Status setGCUrgentPace(int32_t neededSegments, int32_t minSegmentThreshold,
float dirtyReclaimRate, float reclaimWeight, int32_t gcPeriod, float dirtyReclaimRate, float reclaimWeight, int32_t gcPeriod,
int32_t minGCSleepTime, int32_t targetDirtyRatio); int32_t minGCSleepTime, int32_t targetDirtyRatio);

View file

@ -66,6 +66,8 @@ interface IVold {
void fstrim(int fstrimFlags, IVoldTaskListener listener); void fstrim(int fstrimFlags, IVoldTaskListener listener);
void runIdleMaint(boolean needGC, IVoldTaskListener listener); void runIdleMaint(boolean needGC, IVoldTaskListener listener);
void abortIdleMaint(IVoldTaskListener listener); void abortIdleMaint(IVoldTaskListener listener);
// Returns the amount of storage lifetime used, as a percentage.
// (eg, 10 indicates 10% of lifetime used), or -1 on failure.
int getStorageLifeTime(); int getStorageLifeTime();
void setGCUrgentPace(int neededSegments, int minSegmentThreshold, void setGCUrgentPace(int neededSegments, int minSegmentThreshold,
float dirtyReclaimRate, float reclaimWeight, float dirtyReclaimRate, float reclaimWeight,
@ -135,6 +137,11 @@ interface IVold {
long getStorageSize(); long getStorageSize();
// Returns the remaining storage lifetime as a percentage, rounded up as
// needed when the underlying hardware reports low precision. Returns -1
// on failure.
int getStorageRemainingLifetime();
const int FSTRIM_FLAG_DEEP_TRIM = 1; const int FSTRIM_FLAG_DEEP_TRIM = 1;
const int MOUNT_FLAG_PRIMARY = 1; const int MOUNT_FLAG_PRIMARY = 1;