From ecec60e0e119a091277ae2e109db115d4d845d52 Mon Sep 17 00:00:00 2001 From: Kalesh Singh Date: Tue, 13 Jul 2021 00:29:11 +0000 Subject: [PATCH] Add API to get GPU private memory Remove getGpuDmabufUsageKb since the kernel no longer supports the sysfs nodes that this depends on. Add getGpuPrivateMemoryKb which uses the memtrack hal to report the system-wide GPU private memory. Bug: 193226716 Bug: 193465681 Bug: 192621117 Test: dumpsys meminfo Change-Id: Ib90505ec184339d5acbcd42c67dad3ad65dbd933 Merged-In: Ib90505ec184339d5acbcd42c67dad3ad65dbd933 --- core/java/android/os/Debug.java | 4 +-- core/jni/Android.bp | 1 - core/jni/android_os_Debug.cpp | 33 ++++++++----------- .../server/am/ActivityManagerService.java | 12 +++---- 4 files changed, 21 insertions(+), 29 deletions(-) diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index a7516a428ff08..8f15bff87b456 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -2593,11 +2593,11 @@ public final class Debug public static native long getIonPoolsSizeKb(); /** - * Return GPU DMA buffer usage in kB or -1 on error. + * Returns the global total GPU-private memory in kB or -1 on error. * * @hide */ - public static native long getGpuDmaBufUsageKb(); + public static native long getGpuPrivateMemoryKb(); /** * Return DMA-BUF memory mapped by processes in kB. diff --git a/core/jni/Android.bp b/core/jni/Android.bp index b236385768b50..6e7dd437fff49 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -225,7 +225,6 @@ cc_library_shared { ], shared_libs: [ - "android.hardware.memtrack-V1-ndk_platform", "libandroidicu", "libandroid_net", "libbpf_android", diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 5814a187506f4..03508d33cdf75 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -33,7 +33,6 @@ #include #include -#include #include #include #include @@ -46,7 +45,6 @@ #include "jni.h" #include #include -#include #include #include #include @@ -858,29 +856,24 @@ static jlong android_os_Debug_getDmabufHeapPoolsSizeKb(JNIEnv* env, jobject claz return poolsSizeKb; } -static jlong android_os_Debug_getGpuDmaBufUsageKb(JNIEnv* env, jobject clazz) { - std::vector gpu_device_info; - if (!memtrack_gpu_device_info(&gpu_device_info)) { +static jlong android_os_Debug_getGpuPrivateMemoryKb(JNIEnv* env, jobject clazz) { + struct memtrack_proc* p = memtrack_proc_new(); + if (p == nullptr) { + LOG(ERROR) << "getGpuPrivateMemoryKb: Failed to create memtrack_proc"; return -1; } - dmabufinfo::DmabufSysfsStats stats; - if (!GetDmabufSysfsStats(&stats)) { + // Memtrack hal defines PID 0 as global total for GPU-private (GL) memory. + if (memtrack_proc_get(p, 0) != 0) { + // The memtrack HAL may not be available, avoid flooding the log. + memtrack_proc_destroy(p); return -1; } - jlong sizeKb = 0; - const auto& importer_stats = stats.importer_info(); - for (const auto& dev_info : gpu_device_info) { - const auto& importer_info = importer_stats.find(dev_info.name); - if (importer_info == importer_stats.end()) { - continue; - } + ssize_t gpuPrivateMem = memtrack_proc_gl_pss(p); - sizeKb += importer_info->second.size / 1024; - } - - return sizeKb; + memtrack_proc_destroy(p); + return gpuPrivateMem / 1024; } static jlong android_os_Debug_getDmabufMappedSizeKb(JNIEnv* env, jobject clazz) { @@ -991,8 +984,8 @@ static const JNINativeMethod gMethods[] = { (void*)android_os_Debug_getIonHeapsSizeKb }, { "getDmabufTotalExportedKb", "()J", (void*)android_os_Debug_getDmabufTotalExportedKb }, - { "getGpuDmaBufUsageKb", "()J", - (void*)android_os_Debug_getGpuDmaBufUsageKb }, + { "getGpuPrivateMemoryKb", "()J", + (void*)android_os_Debug_getGpuPrivateMemoryKb }, { "getDmabufHeapTotalExportedKb", "()J", (void*)android_os_Debug_getDmabufHeapTotalExportedKb }, { "getIonPoolsSizeKb", "()J", diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index eed3141621a81..7a985f4050f46 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -13831,9 +13831,9 @@ public class ActivityManagerService extends IActivityManager.Stub } final long gpuUsage = Debug.getGpuTotalUsageKb(); if (gpuUsage >= 0) { - final long gpuDmaBufUsage = Debug.getGpuDmaBufUsageKb(); - if (gpuDmaBufUsage >= 0) { - final long gpuPrivateUsage = gpuUsage - gpuDmaBufUsage; + final long gpuPrivateUsage = Debug.getGpuPrivateMemoryKb(); + if (gpuPrivateUsage >= 0) { + final long gpuDmaBufUsage = gpuUsage - gpuPrivateUsage; pw.print(" GPU: "); pw.print(stringifyKBSize(gpuUsage)); pw.print(" ("); @@ -14701,9 +14701,9 @@ public class ActivityManagerService extends IActivityManager.Stub final long gpuUsage = Debug.getGpuTotalUsageKb(); if (gpuUsage >= 0) { - final long gpuDmaBufUsage = Debug.getGpuDmaBufUsageKb(); - if (gpuDmaBufUsage >= 0) { - final long gpuPrivateUsage = gpuUsage - gpuDmaBufUsage; + final long gpuPrivateUsage = Debug.getGpuPrivateMemoryKb(); + if (gpuPrivateUsage >= 0) { + final long gpuDmaBufUsage = gpuUsage - gpuPrivateUsage; memInfoBuilder.append(" GPU: "); memInfoBuilder.append(stringifyKBSize(gpuUsage)); memInfoBuilder.append(" (");