]> git.proxmox.com Git - mirror_lxcfs.git/blobdiff - src/proc_cpuview.c
tree-wide: set _GNU_SOURCE in meson.build
[mirror_lxcfs.git] / src / proc_cpuview.c
index 7d6c0bdd86baa5d080316f788efc4f4e7e2b7c3e..472d69dff40792d477d805626452f26b01e15c67 100644 (file)
@@ -1,20 +1,10 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
-#ifndef FUSE_USE_VERSION
-#define FUSE_USE_VERSION 26
-#endif
-
-#define _FILE_OFFSET_BITS 64
+#include "config.h"
 
-#define __STDC_FORMAT_MACROS
 #include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
-#include <fuse.h>
 #include <inttypes.h>
 #include <libgen.h>
 #include <pthread.h>
@@ -39,8 +29,9 @@
 #include <sys/sysinfo.h>
 #include <sys/vfs.h>
 
+#include "proc_cpuview.h"
+
 #include "bindings.h"
-#include "config.h"
 #include "cgroup_fuse.h"
 #include "cpuset_parse.h"
 #include "cgroups/cgroup.h"
@@ -239,7 +230,7 @@ static struct cg_proc_stat *prune_proc_stat_list(struct cg_proc_stat *node)
 
        for (struct cg_proc_stat *prev = NULL; node; ) {
                if (!cgroup_supports("cpu", node->cg, "cpu.shares")) {
-                       call_cleaner(free_proc_stat_node) struct cg_proc_stat *cur = node;
+                       struct cg_proc_stat *cur = node;
 
                        if (prev)
                                prev->next = node->next;
@@ -247,7 +238,9 @@ static struct cg_proc_stat *prune_proc_stat_list(struct cg_proc_stat *node)
                                first = node->next;
 
                        node = node->next;
-                       lxcfs_debug("Removing stat node for %s\n", cur->cg);
+                       lxcfs_debug("Removing stat node for %s\n", cur);
+
+                       free_proc_stat_node(cur);
                } else {
                        if (!first)
                                first = node;
@@ -308,7 +301,8 @@ out:
        return node;
 }
 
-static struct cg_proc_stat *find_or_create_proc_stat_node(struct cpuacct_usage *usage, int cpu_count, const char *cg)
+static struct cg_proc_stat *find_or_create_proc_stat_node(struct cpuacct_usage *usage,
+                                                         int cpu_count, const char *cg)
 {
        int hash = calc_hash(cg) % CPUVIEW_HASH_SIZE;
        struct cg_proc_stat_head *head = proc_stat_history[hash];
@@ -404,7 +398,7 @@ static uint64_t diff_cpu_usage(struct cpuacct_usage *older,
 /*
  * Read cgroup CPU quota parameters from `cpu.cfs_quota_us` or
  * `cpu.cfs_period_us`, depending on `param`. Parameter value is returned
- * throuh `value`.
+ * through `value`.
  */
 static bool read_cpu_cfs_param(const char *cg, const char *param, int64_t *value)
 {
@@ -585,10 +579,9 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
 
                if (all_used >= cg_used) {
                        cg_cpu_usage[curcpu].idle = idle + (all_used - cg_used);
-
                } else {
-                       lxcfs_error("cpu%d from %s has unexpected cpu time: %" PRIu64 " in /proc/stat, %" PRIu64 " in cpuacct.usage_all; unable to determine idle time",
-                                   curcpu, cg, all_used, cg_used);
+                       lxcfs_v("cpu%d from %s has unexpected cpu time: %" PRIu64 " in /proc/stat, %" PRIu64 " in cpuacct.usage_all; unable to determine idle time",
+                               curcpu, cg, all_used, cg_used);
                        cg_cpu_usage[curcpu].idle = idle;
                }
        }
@@ -598,13 +591,14 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
        if (max_cpus > cpu_cnt || !max_cpus)
                max_cpus = cpu_cnt;
 
+       /* takes lock pthread_mutex_lock(&node->lock) */
        stat_node = find_or_create_proc_stat_node(cg_cpu_usage, nprocs, cg);
        if (!stat_node)
                return log_error(0, "Failed to find/create stat node for %s", cg);
 
        diff = zalloc(sizeof(struct cpuacct_usage) * nprocs);
        if (!diff)
-               return 0;
+               goto out_pthread_mutex_unlock;
 
        /*
         * If the new values are LOWER than values stored in memory, it means
@@ -648,7 +642,6 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
                uint64_t max_diff_idle = 0;
                uint64_t max_diff_idle_index = 0;
                double exact_cpus;
-
                /* threshold = maximum usage per cpu, including idle */
                threshold = total_sum / cpu_cnt * max_cpus;
 
@@ -753,10 +746,16 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
                     "cpu  %" PRIu64 " 0 %" PRIu64 " %" PRIu64 " 0 0 0 0 0 0\n",
                     user_sum, system_sum, idle_sum);
        lxcfs_v("cpu-all: %s\n", buf);
-       if (l < 0)
-               return log_error(0, "Failed to write cache");
-       if (l >= buf_size)
-               return log_error(0, "Write to cache was truncated");
+       if (l < 0) {
+               lxcfs_error("Failed to write cache");
+               total_len = 0;
+               goto out_pthread_mutex_unlock;
+       }
+       if ((size_t)l >= buf_size) {
+               lxcfs_error("Write to cache was truncated");
+               total_len = 0;
+               goto out_pthread_mutex_unlock;
+       }
 
        buf += l;
        buf_size -= l;
@@ -778,10 +777,16 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
                             stat_node->view[curcpu].system,
                             stat_node->view[curcpu].idle);
                lxcfs_v("cpu: %s\n", buf);
-               if (l < 0)
-                       return log_error(0, "Failed to write cache");
-               if (l >= buf_size)
-                       return log_error(0, "Write to cache was truncated");
+               if (l < 0) {
+                       lxcfs_error("Failed to write cache");
+                       total_len = 0;
+                       goto out_pthread_mutex_unlock;
+               }
+               if ((size_t)l >= buf_size) {
+                       lxcfs_error("Write to cache was truncated");
+                       total_len = 0;
+                       goto out_pthread_mutex_unlock;
+               }
 
                buf += l;
                buf_size -= l;
@@ -790,10 +795,16 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
 
        /* Pass the rest of /proc/stat, start with the last line read */
        l = snprintf(buf, buf_size, "%s", line);
-       if (l < 0)
-               return log_error(0, "Failed to write cache");
-       if (l >= buf_size)
-               return log_error(0, "Write to cache was truncated");
+       if (l < 0) {
+               lxcfs_error("Failed to write cache");
+               total_len = 0;
+               goto out_pthread_mutex_unlock;
+       }
+       if ((size_t)l >= buf_size) {
+               lxcfs_error("Write to cache was truncated");
+               total_len = 0;
+               goto out_pthread_mutex_unlock;
+       }
 
        buf += l;
        buf_size -= l;
@@ -802,16 +813,23 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
        /* Pass the rest of the host's /proc/stat */
        while (getline(&line, &linelen, f) != -1) {
                l = snprintf(buf, buf_size, "%s", line);
-               if (l < 0)
-                       return log_error(0, "Failed to write cache");
-               if (l >= buf_size)
-                       return log_error(0, "Write to cache was truncated");
+               if (l < 0) {
+                       lxcfs_error("Failed to write cache");
+                       total_len = 0;
+                       goto out_pthread_mutex_unlock;
+               }
+               if ((size_t)l >= buf_size) {
+                       lxcfs_error("Write to cache was truncated");
+                       total_len = 0;
+                       goto out_pthread_mutex_unlock;
+               }
 
                buf += l;
                buf_size -= l;
                total_len += l;
        }
 
+out_pthread_mutex_unlock:
        if (stat_node)
                pthread_mutex_unlock(&stat_node->lock);
 
@@ -854,7 +872,7 @@ int proc_cpuinfo_read(char *buf, size_t size, off_t offset,
        size_t cache_size = d->buflen;
 
        if (offset) {
-               int left;
+               size_t left;
 
                if (offset > d->size)
                        return -EINVAL;
@@ -917,7 +935,7 @@ int proc_cpuinfo_read(char *buf, size_t size, off_t offset,
                                l = snprintf(cache, cache_size, "processor      : %d\n", curcpu);
                                if (l < 0)
                                        return log_error(0, "Failed to write cache");
-                               if (l >= cache_size)
+                               if ((size_t)l >= cache_size)
                                        return log_error(0, "Write to cache was truncated");
                                cache += l;
                                cache_size -= l;
@@ -942,7 +960,7 @@ int proc_cpuinfo_read(char *buf, size_t size, off_t offset,
                        l = snprintf(cache, cache_size, "processor %d:%s", curcpu, p);
                        if (l < 0)
                                return log_error(0, "Failed to write cache");
-                       if (l >= cache_size)
+                       if ((size_t)l >= cache_size)
                                return log_error(0, "Write to cache was truncated");
 
                        cache += l;
@@ -955,7 +973,7 @@ int proc_cpuinfo_read(char *buf, size_t size, off_t offset,
                        l = snprintf(cache, cache_size, "%s", line);
                        if (l < 0)
                                return log_error(0, "Failed to write cache");
-                       if (l >= cache_size)
+                       if ((size_t)l >= cache_size)
                                return log_error(0, "Write to cache was truncated");
 
                        cache += l;
@@ -978,21 +996,21 @@ int proc_cpuinfo_read(char *buf, size_t size, off_t offset,
                cache_size = d->buflen;
                total_len = 0;
                l = snprintf(cache, cache_size, "vendor_id       : IBM/S390\n");
-               if (l < 0 || l >= cache_size)
+               if (l < 0 || (size_t)l >= cache_size)
                        return 0;
 
                cache_size -= l;
                cache += l;
                total_len += l;
                l = snprintf(cache, cache_size, "# processors    : %d\n", curcpu + 1);
-               if (l < 0 || l >= cache_size)
+               if (l < 0 || (size_t)l >= cache_size)
                        return 0;
 
                cache_size -= l;
                cache += l;
                total_len += l;
                l = snprintf(cache, cache_size, "%s", origcache);
-               if (l < 0 || l >= cache_size)
+               if (l < 0 || (size_t)l >= cache_size)
                        return 0;
                total_len += l;
        }