Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f30df7e6 authored by Kalesh Singh's avatar Kalesh Singh Committed by Suren Baghdasaryan
Browse files

Provide an interface to query dmabuf GPU allocations

The DMA buffers mapped by GPU device(s) are already accounted for
in the total exported dmabuf size (ionHeap) size.

To remove GPU memory from lost RAM, provide an API to get only the
DMA buf memory mapped by the GPU device(s).

Bug: 176477627
Test: adb shell dumpsys meminfo
Change-Id: Ie72f46c8de026b143629406714f413677ce6693b
parent f53b7111
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -2588,6 +2588,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:
+1 −0
Original line number Diff line number Diff line
@@ -207,6 +207,7 @@ cc_library_shared {
            ],

            shared_libs: [
                "android.hardware.memtrack-unstable-ndk_platform",
                "audioclient-types-aidl-cpp",
                "audioflinger-aidl-cpp",
                "av-types-aidl-cpp",
+29 −0
Original line number Diff line number Diff line
@@ -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>
@@ -838,6 +840,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;
@@ -946,6 +973,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",
+13 −1
Original line number Diff line number Diff line
@@ -10736,8 +10736,20 @@ 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;
                    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));
                }
            }
            /*
             * Note: ION/DMA-BUF heap pools are reclaimable and hence, they are included as part of
+16 −3
Original line number Diff line number Diff line
@@ -1537,10 +1537,23 @@ public class AppProfiler {

        final long gpuUsage = Debug.getGpuTotalUsageKb();
        if (gpuUsage >= 0) {
            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(
                                  totalPss - cachedPss + kernelUsed));