#define STR_SGX_PATH "/dev/pvrsrvkm"
#define STR_3D_PATH1 "/dev/mali"
#define STR_3D_PATH2 "/dev/kgsl-3d0"
+#define STR_3D_UNIFIED_PATH "/usr/bin/gpu_mem_info"
#define STR_DRM_PATH1 "/drm mm object (deleted)"
#define STR_DRM_PATH2 "/dev/dri/card0"
#define MEMCG_PATH "/sys/fs/cgroup/memory"
static int sum;
static int verbos;
+static int use_gpu_mem_info = 0;
/* reads file contents into memory */
static char* cread(const char* path)
tmi->gem_mmap = 0;
}
+unsigned int get_graphic_3d_meminfo(unsigned int tgid)
+{
+ char command[256], buf[256];
+ char *tmp[2];
+ unsigned int size = 0;
+ int tid, ret;
+ FILE *p_gpu;
+
+ snprintf(command, sizeof(command), "%s %d", STR_3D_UNIFIED_PATH, tgid);
+ p_gpu = popen(command, "r");
+ if (p_gpu) {
+ fgets(buf, 256, p_gpu);
+ ret = sscanf(buf, "%d %ms %d %ms", &tid, &tmp[0], &size, &tmp[1]);
+ if (ret == 4) {
+ free(tmp[0]);
+ free(tmp[1]);
+ }
+ pclose(p_gpu);
+ }
+ return size;
+}
+
static int
get_trib_mapinfo(unsigned int tgid, mapinfo *milist,
geminfo *gilist, trib_mapinfo *result)
return -EINVAL;
init_trib_mapinfo(result);
+
+ if (use_gpu_mem_info)
+ result->graphic_3d = get_graphic_3d_meminfo(tgid);
+
for (mi = milist; mi;) {
- if (strstr(mi->name, STR_SGX_PATH)) {
+ if (!use_gpu_mem_info && strstr(mi->name, STR_SGX_PATH)) {
result->graphic_3d += mi->pss;
- } else if (strstr(mi->name, STR_3D_PATH1) ||
+ } else if (!use_gpu_mem_info && strstr(mi->name, STR_3D_PATH1) ||
strstr(mi->name, STR_3D_PATH2)) {
result->graphic_3d += mi->size;
} else if (mi->rss != 0 && mi->pss == 0
return 0;
}
+ use_gpu_mem_info = (!access(STR_3D_UNIFIED_PATH, F_OK | X_OK)) ? 1 : 0;
+ errno = 0;
+
pDir = opendir("/proc");
if (pDir == NULL) {
fprintf(stderr, "cannot read directory /proc.\n");