Fix GL memory not being removed from lost RAM

Devices upgrading to S are not required to update their memtrack HAL
implementation and won't support reporting the total GPU private memory.

In these cases it's likely the HAL reports 0 for the total GPU private
memory, since in S the HAL defition only overloads the already existing
getMemory() API to report this.

Return an error value in these cases to prevent swapping the sum of GL
type memory for all processes with the total GPU private memory when not
supported as doing this effectively leaves the GL memory as part of
lost RAM.

Bug: 203245390
Test: dumpsys meminfo
Change-Id: I478143e435b047bf349bd4ec6808707a5db1505b
Merged-In: I478143e435b047bf349bd4ec6808707a5db1505b
This commit is contained in:
Kalesh Singh
2021-11-23 11:42:09 -08:00
parent 611424795b
commit e164776ab0

View File

@@ -34,6 +34,7 @@
#include <vector>
#include <android-base/logging.h>
#include <android-base/properties.h>
#include <bionic/malloc.h>
#include <debuggerd/client.h>
#include <log/log.h>
@@ -859,7 +860,22 @@ static jlong android_os_Debug_getDmabufHeapPoolsSizeKb(JNIEnv* env, jobject claz
return poolsSizeKb;
}
static bool halSupportsGpuPrivateMemory() {
int productApiLevel =
android::base::GetIntProperty("ro.product.first_api_level",
android::base::GetIntProperty("ro.build.version.sdk",
__ANDROID_API_FUTURE__));
int boardApiLevel =
android::base::GetIntProperty("ro.board.api_level",
android::base::GetIntProperty("ro.board.first_api_level",
__ANDROID_API_FUTURE__));
return std::min(productApiLevel, boardApiLevel) >= __ANDROID_API_S__;
}
static jlong android_os_Debug_getGpuPrivateMemoryKb(JNIEnv* env, jobject clazz) {
static bool gpuPrivateMemorySupported = halSupportsGpuPrivateMemory();
struct memtrack_proc* p = memtrack_proc_new();
if (p == nullptr) {
LOG(ERROR) << "getGpuPrivateMemoryKb: Failed to create memtrack_proc";
@@ -876,6 +892,12 @@ static jlong android_os_Debug_getGpuPrivateMemoryKb(JNIEnv* env, jobject clazz)
ssize_t gpuPrivateMem = memtrack_proc_gl_pss(p);
memtrack_proc_destroy(p);
// Old HAL implementations may return 0 for GPU private memory if not supported
if (gpuPrivateMem == 0 && !gpuPrivateMemorySupported) {
return -1;
}
return gpuPrivateMem / 1024;
}