]> git.proxmox.com Git - mirror_lxcfs.git/blobdiff - src/proc_cpuview.c
Add support for fuse3
[mirror_lxcfs.git] / src / proc_cpuview.c
index 8408ae3d38004a225134f9097659fb0db324e542..b0046638d70a9aff47286829982b20675ff0ddb7 100644 (file)
@@ -4,9 +4,17 @@
 #define _GNU_SOURCE
 #endif
 
+#include "config.h"
+
+#ifdef HAVE_FUSE3
+#ifndef FUSE_USE_VERSION
+#define FUSE_USE_VERSION 30
+#endif
+#else
 #ifndef FUSE_USE_VERSION
 #define FUSE_USE_VERSION 26
 #endif
+#endif
 
 #define _FILE_OFFSET_BITS 64
 
@@ -40,7 +48,6 @@
 #include <sys/vfs.h>
 
 #include "bindings.h"
-#include "config.h"
 #include "cgroup_fuse.h"
 #include "cpuset_parse.h"
 #include "cgroups/cgroup.h"
@@ -602,7 +609,7 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
        if (!stat_node)
                return log_error(0, "Failed to find/create stat node for %s", cg);
 
-       diff = malloc(sizeof(struct cpuacct_usage) * nprocs);
+       diff = zalloc(sizeof(struct cpuacct_usage) * nprocs);
        if (!diff)
                return 0;
 
@@ -630,13 +637,13 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
 
                i++;
 
-               stat_node->usage[curcpu].user += diff[curcpu].user;
+               stat_node->usage[curcpu].user   += diff[curcpu].user;
                stat_node->usage[curcpu].system += diff[curcpu].system;
-               stat_node->usage[curcpu].idle += diff[curcpu].idle;
+               stat_node->usage[curcpu].idle   += diff[curcpu].idle;
 
                if (max_cpus > 0 && i >= max_cpus) {
-                       user_surplus += diff[curcpu].user;
-                       system_surplus += diff[curcpu].system;
+                       user_surplus    += diff[curcpu].user;
+                       system_surplus  += diff[curcpu].system;
                }
        }
 
@@ -690,20 +697,20 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
                        if (i == max_cpus)
                                break;
 
-                       stat_node->view[curcpu].user += diff[curcpu].user;
-                       stat_node->view[curcpu].system += diff[curcpu].system;
-                       stat_node->view[curcpu].idle += diff[curcpu].idle;
+                       stat_node->view[curcpu].user    += diff[curcpu].user;
+                       stat_node->view[curcpu].system  += diff[curcpu].system;
+                       stat_node->view[curcpu].idle    += diff[curcpu].idle;
 
-                       user_sum += stat_node->view[curcpu].user;
-                       system_sum += stat_node->view[curcpu].system;
-                       idle_sum += stat_node->view[curcpu].idle;
+                       user_sum        += stat_node->view[curcpu].user;
+                       system_sum      += stat_node->view[curcpu].system;
+                       idle_sum        += stat_node->view[curcpu].idle;
 
-                       diff_user += diff[curcpu].user;
-                       diff_system += diff[curcpu].system;
-                       diff_idle += diff[curcpu].idle;
+                       diff_user       += diff[curcpu].user;
+                       diff_system     += diff[curcpu].system;
+                       diff_idle       += diff[curcpu].idle;
                        if (diff[curcpu].idle > max_diff_idle) {
-                               max_diff_idle = diff[curcpu].idle;
-                               max_diff_idle_index = curcpu;
+                               max_diff_idle           = diff[curcpu].idle;
+                               max_diff_idle_index     = curcpu;
                        }
 
                        lxcfs_v("curcpu: %d, diff_user: %lu, diff_system: %lu, diff_idle: %lu\n", curcpu, diff[curcpu].user, diff[curcpu].system, diff[curcpu].idle);
@@ -718,12 +725,18 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
                        lxcfs_v("revising cpu usage view to match the exact cpu count [%f]\n", exact_cpus);
                        lxcfs_v("delta: %lu\n", delta);
                        lxcfs_v("idle_sum before: %lu\n", idle_sum);
-                       idle_sum = idle_sum > delta ? idle_sum - delta : 0;
+                       if (idle_sum > delta)
+                               idle_sum = idle_sum - delta;
+                       else
+                               idle_sum = 0;
                        lxcfs_v("idle_sum after: %lu\n", idle_sum);
 
                        curcpu = max_diff_idle_index;
                        lxcfs_v("curcpu: %d, idle before: %lu\n", curcpu, stat_node->view[curcpu].idle);
-                       stat_node->view[curcpu].idle = stat_node->view[curcpu].idle > delta ? stat_node->view[curcpu].idle - delta : 0;
+                       if (stat_node->view[curcpu].idle > delta)
+                               stat_node->view[curcpu].idle = stat_node->view[curcpu].idle - delta;
+                       else
+                               stat_node->view[curcpu].idle = 0;
                        lxcfs_v("curcpu: %d, idle after: %lu\n", curcpu, stat_node->view[curcpu].idle);
                }
        } else {
@@ -731,13 +744,13 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
                        if (!stat_node->usage[curcpu].online)
                                continue;
 
-                       stat_node->view[curcpu].user = stat_node->usage[curcpu].user;
-                       stat_node->view[curcpu].system = stat_node->usage[curcpu].system;
-                       stat_node->view[curcpu].idle = stat_node->usage[curcpu].idle;
+                       stat_node->view[curcpu].user    = stat_node->usage[curcpu].user;
+                       stat_node->view[curcpu].system  = stat_node->usage[curcpu].system;
+                       stat_node->view[curcpu].idle    = stat_node->usage[curcpu].idle;
 
-                       user_sum += stat_node->view[curcpu].user;
-                       system_sum += stat_node->view[curcpu].system;
-                       idle_sum += stat_node->view[curcpu].idle;
+                       user_sum        += stat_node->view[curcpu].user;
+                       system_sum      += stat_node->view[curcpu].system;
+                       idle_sum        += stat_node->view[curcpu].idle;
                }
        }
 
@@ -1091,18 +1104,18 @@ int read_cpuacct_usage_all(char *cg, char *cpuset,
 
 static bool cpuview_init_head(struct cg_proc_stat_head **head)
 {
-       *head = malloc(sizeof(struct cg_proc_stat_head));
-       if (!(*head))
-               return log_error(false, "%s", strerror(errno));
+       __do_free struct cg_proc_stat_head *h;
+
+       h = zalloc(sizeof(struct cg_proc_stat_head));
+       if (!h)
+               return false;
 
-       (*head)->lastcheck = time(NULL);
-       (*head)->next = NULL;
+       if (pthread_rwlock_init(&h->lock, NULL))
+               return false;
 
-       if (pthread_rwlock_init(&(*head)->lock, NULL) != 0) {
-               free_disarm(*head);
-               return log_error(false, "Failed to initialize list lock");
-       }
+       h->lastcheck = time(NULL);
 
+       *head = move_ptr(h);
        return true;
 }