diff options
| -rw-r--r-- | core/java/android/os/Debug.java | 7 | ||||
| -rw-r--r-- | core/jni/Android.bp | 1 | ||||
| -rw-r--r-- | core/jni/android_os_Debug.cpp | 29 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 33 | 
4 files changed, 66 insertions, 4 deletions
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index a2cf1aee3250..ea282afb8b8e 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -2584,6 +2584,13 @@ public final class Debug      public static native long getIonPoolsSizeKb();      /** +     * Return GPU DMA buffer usage in kB or -1 on error. +     * +     * @hide +     */ +    public static native long getGpuDmaBufUsageKb(); + +    /**       * Return DMA-BUF memory mapped by processes in kB.       * Notes:       *  * Warning: Might impact performance as it reads /proc/<pid>/maps files for each process. diff --git a/core/jni/Android.bp b/core/jni/Android.bp index 79a0dfd61e9f..088682c9f2d8 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -206,6 +206,7 @@ cc_library_shared {              ],              shared_libs: [ +                "android.hardware.memtrack-unstable-ndk_platform",                  "libandroidicu",                  "libbpf_android",                  "libnetdbpf", diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index c4caef2ecdb9..223b4dcc0549 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -33,6 +33,7 @@  #include <string>  #include <vector> +#include <aidl/android/hardware/memtrack/DeviceInfo.h>  #include <android-base/logging.h>  #include <bionic/malloc.h>  #include <debuggerd/client.h> @@ -45,6 +46,7 @@  #include "jni.h"  #include <dmabufinfo/dmabuf_sysfs_stats.h>  #include <dmabufinfo/dmabufinfo.h> +#include <dmabufinfo/dmabuf_sysfs_stats.h>  #include <meminfo/procmeminfo.h>  #include <meminfo/sysmeminfo.h>  #include <memtrack/memtrack.h> @@ -846,6 +848,31 @@ static jlong android_os_Debug_getDmabufHeapPoolsSizeKb(JNIEnv* env, jobject claz      return poolsSizeKb;  } +static jlong android_os_Debug_getGpuDmaBufUsageKb(JNIEnv* env, jobject clazz) { +    std::vector<aidl::android::hardware::memtrack::DeviceInfo> gpu_device_info; +    if (!memtrack_gpu_device_info(&gpu_device_info)) { +        return -1; +    } + +    dmabufinfo::DmabufSysfsStats stats; +    if (!GetDmabufSysfsStats(&stats)) { +        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; +        } + +        sizeKb += importer_info->second.size; +    } + +    return sizeKb; +} +  static jlong android_os_Debug_getDmabufMappedSizeKb(JNIEnv* env, jobject clazz) {      jlong dmabufPss = 0;      std::vector<dmabufinfo::DmaBuffer> dmabufs; @@ -954,6 +981,8 @@ static const JNINativeMethod gMethods[] = {              (void*)android_os_Debug_getIonHeapsSizeKb },      { "getDmabufTotalExportedKb", "()J",              (void*)android_os_Debug_getDmabufTotalExportedKb }, +    { "getGpuDmaBufUsageKb", "()J", +            (void*)android_os_Debug_getGpuDmaBufUsageKb },      { "getIonPoolsSizeKb", "()J",              (void*)android_os_Debug_getIonPoolsSizeKb },      { "getDmabufMappedSizeKb", "()J", diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index c19bedebfeac..2b2e87617f0a 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -13756,7 +13756,19 @@ public class ActivityManagerService extends IActivityManager.Stub              }              final long gpuUsage = Debug.getGpuTotalUsageKb();              if (gpuUsage >= 0) { -                pw.print("      GPU: "); pw.println(stringifyKBSize(gpuUsage)); +                final long gpuDmaBufUsage = Debug.getGpuDmaBufUsageKb(); +                if (gpuDmaBufUsage >= 0) { +                    final long gpuPrivateUsage = gpuUsage - gpuDmaBufUsage; +                    pw.print("      GPU: "); +                    pw.print(stringifyKBSize(gpuUsage)); +                    pw.print(" ("); +                    pw.print(stringifyKBSize(gpuDmaBufUsage)); +                    pw.print(" dmabuf + "); +                    pw.print(stringifyKBSize(gpuPrivateUsage)); +                    pw.println(" private)"); +                } else { +                    pw.print("      GPU: "); pw.println(stringifyKBSize(gpuUsage)); +                }              }              /* @@ -14586,9 +14598,22 @@ public class ActivityManagerService extends IActivityManager.Stub          final long gpuUsage = Debug.getGpuTotalUsageKb();          if (gpuUsage >= 0) { -            memInfoBuilder.append("       GPU: "); -            memInfoBuilder.append(stringifyKBSize(gpuUsage)); -            memInfoBuilder.append("\n"); +            final long gpuDmaBufUsage = Debug.getGpuDmaBufUsageKb(); +            if (gpuDmaBufUsage >= 0) { +                final long gpuPrivateUsage = gpuUsage - gpuDmaBufUsage; +                memInfoBuilder.append("      GPU: "); +                memInfoBuilder.append(stringifyKBSize(gpuUsage)); +                memInfoBuilder.append(" ("); +                memInfoBuilder.append(stringifyKBSize(gpuDmaBufUsage)); +                memInfoBuilder.append(" dmabuf + "); +                memInfoBuilder.append(stringifyKBSize(gpuPrivateUsage)); +                memInfoBuilder.append(" private)\n"); +            } else { +                memInfoBuilder.append("       GPU: "); +                memInfoBuilder.append(stringifyKBSize(gpuUsage)); +                memInfoBuilder.append("\n"); +            } +          }          memInfoBuilder.append("  Used RAM: ");          memInfoBuilder.append(stringifyKBSize(  |