#include "GpuSysfsReader.h" #include #include #include #include "filesystem.h" #undef LOG_TAG #define LOG_TAG "memtrack-gpusysfsreader" using namespace GpuSysfsReader; namespace { uint64_t readNode(const std::string node, pid_t pid) { std::stringstream ss; if (pid) ss << kSysfsDevicePath << "/" << kProcessDir << "/" << pid << "/" << node; else ss << kSysfsDevicePath << "/" << node; const std::string path = ss.str(); if (!filesystem::exists(filesystem::path(path))) { ALOGV("File not found: %s", path.c_str()); return 0; } std::ifstream file(path.c_str()); if (!file.is_open()) { ALOGW("Failed to open %s path", path.c_str()); return 0; } uint64_t out; file >> out; file.close(); return out; } } // namespace uint64_t GpuSysfsReader::getDmaBufGpuMem(pid_t pid) { return readNode(kDmaBufGpuMemNode, pid); } uint64_t GpuSysfsReader::getGpuMemTotal(pid_t pid) { return readNode(kTotalGpuMemNode, pid); } uint64_t GpuSysfsReader::getPrivateGpuMem(pid_t pid) { auto dma_buf_size = getDmaBufGpuMem(pid); auto gpu_total_size = getGpuMemTotal(pid); if (dma_buf_size > gpu_total_size) { ALOGE("Bug in reader, dma-buf size (%" PRIu64 ") is higher than total gpu size (%" PRIu64 ")", dma_buf_size, gpu_total_size); return 0; } return gpu_total_size - dma_buf_size; }