From 92ec572910fa6bfca7199ee3cd75989c29f61b94 Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Mon, 4 Jul 2022 11:14:38 +0900 Subject: [PATCH] util: kernel: gpu-mem: Improve process for finding gpu node To get rid of redundant gpu node checking at every update, finding gpu node will be proceeded at once as constructor. Change-Id: I30c18784f578e224e812c9ee9e0d9a4704cf901a Signed-off-by: Dongwoo Lee --- include/util/gpu-mem.h | 33 ++++++++++++++++++++++++--------- include/util/kernel.h | 1 + src/util/kernel.c | 28 ++++++++++++++++++++-------- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/include/util/gpu-mem.h b/include/util/gpu-mem.h index cdf865e..ce69b1c 100644 --- a/include/util/gpu-mem.h +++ b/include/util/gpu-mem.h @@ -19,6 +19,7 @@ #ifndef __GPU_MEM_H__ #define __GPU_MEM_H__ +#include #include struct gpu_mem_node { @@ -32,20 +33,34 @@ 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 diff --git a/include/util/kernel.h b/include/util/kernel.h index b3b9a3d..12ae6e9 100644 --- a/include/util/kernel.h +++ b/include/util/kernel.h @@ -68,4 +68,5 @@ int kernel_get_process_taskstats(struct taskstats *stats, int cmd_type, pid_t pi int kernel_get_thread_group_taskstats(struct taskstats *stats, pid_t tgid, bool get_proc_info); int kernel_get_thread_group_map_info(struct proc_map_info *map_info, pid_t tgid, bool include_gpu_mem); +bool kernel_check_gpu_support(void); #endif diff --git a/src/util/kernel.c b/src/util/kernel.c index e714c6a..e53e2fb 100644 --- a/src/util/kernel.c +++ b/src/util/kernel.c @@ -29,6 +29,7 @@ #include static int have_smaps_rollup; +static struct gpu_mem_node *gpu_mem_node; static int __get_cpu_num(char *path) { @@ -426,21 +427,22 @@ static inline bool is_new_entry(const char *str) 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; @@ -448,6 +450,8 @@ new_entry: } } } + + return mem_size; } int kernel_get_thread_group_map_info(struct proc_map_info *map_info, @@ -466,9 +470,11 @@ 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); @@ -485,7 +491,13 @@ int kernel_get_thread_group_map_info(struct proc_map_info *map_info, 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(); } -- 2.7.4