#ifndef __GPU_MEM_H__
#define __GPU_MEM_H__
+#include <stdio.h>
#include <util/common.h>
struct gpu_mem_node {
* if pass-hal provides gpu information.
*/
static struct gpu_mem_node gpu_mem_nodes[] = {
- { .name = "SGX", .path = "/dev/pvrsrvkm", .node = "Pss:" },
- { .name = "MALI", .path = "/dev/mali", .node = "Size:"},
- { .name = "KGSL", .path = "/dev/kgsl-3d0", .node = "Size:"},
+ { .name = "SGX", .path = "pvrsrvkm", .node = "Pss:" },
+ { .name = "MALI", .path = "mali", .node = "Size:"},
+ { .name = "KGSL", .path = "kgsl-3d0", .node = "Size:"},
};
-static inline struct gpu_mem_node *get_gpu_mem_node(const char *name)
+static inline struct gpu_mem_node *get_system_gpu_mem_node(void)
{
+ struct gpu_mem_node *node = NULL;
+ struct dirent *dev_entry;
+ DIR *dev_dir;
int i;
- for (i = 0; i < ARRAY_SIZE(gpu_mem_nodes); i++)
- if (strstr(name, gpu_mem_nodes[i].path))
- return &gpu_mem_nodes[i];
+ dev_dir = opendir("/dev/");
- return NULL;
-}
+ while ((dev_entry = readdir(dev_dir)) != NULL) {
+ if (dev_entry->d_type == DT_DIR && dev_entry->d_type != DT_UNKNOWN)
+ continue;
+
+ for (i = 0; i < ARRAY_SIZE(gpu_mem_nodes); i++) {
+ if (strstr(dev_entry->d_name, gpu_mem_nodes[i].path)) {
+ node = &gpu_mem_nodes[i];
+ break;
+ }
+ }
+ }
+ closedir(dev_dir);
+
+ return node;
+}
#endif
#include <util/gpu-mem.h>
static int have_smaps_rollup;
+static struct gpu_mem_node *gpu_mem_node;
static int __get_cpu_num(char *path)
{
return ((*str >= '0' && *str <= '9') || (*str >= 'a' && *str <= 'f'));
}
-static void
-get_gpu_mem_info(struct proc_map_info *map_info, FILE *smaps_fd, char *entry)
+static unsigned long get_gpu_mem_size(FILE *smaps_fd, char *entry)
{
- struct gpu_mem_node *gnode = NULL;
+ unsigned long mem_size = 0;
char name[BUFF_MAX];
char buffer[BUFF_MAX];
+ if (!gpu_mem_node)
+ return 0;
+
new_entry:
sscanf(entry, "%*s %*s %*s %*s %*s %[^\n]", name);
- gnode = get_gpu_mem_node(name);
- if (gnode) {
+ if (strstr(name, gpu_mem_node->path)) {
while (fgets(buffer, sizeof(buffer), smaps_fd)) {
- if (strstr(buffer, gnode->node))
- map_info->gpu_mem += strtol(buffer + strlen(gnode->node), NULL, 10);
+ if (strstr(buffer, gpu_mem_node->node))
+ mem_size += strtol(buffer + strlen(gpu_mem_node->node), NULL, 10);
if (is_new_entry(buffer)) {
entry = buffer;
}
}
}
+
+ return mem_size;
}
int kernel_get_thread_group_map_info(struct proc_map_info *map_info,
return -ENOENT;
}
+ memset(map_info, 0, sizeof(struct proc_map_info));
+
while (fgets(buffer, sizeof(buffer), smaps_fd)) {
if (include_gpu_mem && is_new_entry(buffer))
- get_gpu_mem_info(map_info, smaps_fd, buffer);
+ map_info->gpu_mem += get_gpu_mem_size(smaps_fd, buffer);
if (strstr(buffer, "Rss:"))
map_info->rss += strtol(buffer + 4, NULL, 10);
return 0;
}
+bool kernel_check_gpu_support(void)
+{
+ return !!gpu_mem_node;
+}
+
static void __CONSTRUCTOR__ kernel_init(void)
{
have_smaps_rollup = !access("/proc/self/smaps_rollup", R_OK);
+ gpu_mem_node = get_system_gpu_mem_node();
}