util: kernel: gpu-mem: Improve process for finding gpu node 58/277258/3
authorDongwoo Lee <dwoo08.lee@samsung.com>
Mon, 4 Jul 2022 02:14:38 +0000 (11:14 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Thu, 7 Jul 2022 01:54:16 +0000 (01:54 +0000)
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 <dwoo08.lee@samsung.com>
include/util/gpu-mem.h
include/util/kernel.h
src/util/kernel.c

index cdf865e..ce69b1c 100644 (file)
@@ -19,6 +19,7 @@
 #ifndef __GPU_MEM_H__
 #define __GPU_MEM_H__
 
+#include <stdio.h>
 #include <util/common.h>
 
 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
index b3b9a3d..12ae6e9 100644 (file)
@@ -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
index e714c6a..e53e2fb 100644 (file)
@@ -29,6 +29,7 @@
 #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)
 {
@@ -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();
 }