The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxcfs/pull/293
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === I don't know for what reason anyone but care but I guess ok. Closes #292. Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From 721060636156c9b086ef5e7b2149d91addb1d4b5 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Thu, 18 Jul 2019 15:44:06 +0200 Subject: [PATCH] bindings: enable higher precision uptime I don't know for what reason anyone but care but I guess ok. Closes #292. Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- bindings.c | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/bindings.c b/bindings.c index 650c297..c1af837 100644 --- a/bindings.c +++ b/bindings.c @@ -4010,10 +4010,11 @@ static uint64_t get_reaper_start_time(pid_t pid) return starttime; } -static uint64_t get_reaper_start_time_in_sec(pid_t pid) +static double get_reaper_start_time_in_sec(pid_t pid) { uint64_t clockticks; int64_t ticks_per_sec; + double res = 0; clockticks = get_reaper_start_time(pid); if (clockticks == 0 && errno == EINVAL) { @@ -4029,12 +4030,15 @@ static uint64_t get_reaper_start_time_in_sec(pid_t pid) return 0; } - return (clockticks /= ticks_per_sec); + res = (clockticks / ticks_per_sec); + return res; } -static uint64_t get_reaper_age(pid_t pid) +static double get_reaper_age(pid_t pid) { - uint64_t procstart, uptime, procage; + uint64_t uptime_ms; + double procstart, procage; + // double procstart, uptime, procage; /* We need to substract the time the process has started since system * boot minus the time when the system has started to get the actual @@ -4049,13 +4053,14 @@ static uint64_t get_reaper_age(pid_t pid) ret = clock_gettime(CLOCK_BOOTTIME, &spec); if (ret < 0) return 0; + /* We could make this more precise here by using the tv_nsec * field in the timespec struct and convert it to milliseconds * and then create a double for the seconds and milliseconds but * that seems more work than it is worth. */ - uptime = spec.tv_sec; - procage = uptime - procstart; + uptime_ms = (spec.tv_sec * 1000) + (spec.tv_nsec * 1e-6); + procage = (uptime_ms - (procstart * 1000)) / 1000; } return procage; @@ -4102,7 +4107,7 @@ static int read_cpuacct_usage_all(char *cg, char *cpuset, struct cpuacct_usage * // convert cpuacct.usage_percpu into cpuacct.usage_all lxcfs_v("converting cpuacct.usage_percpu into cpuacct.usage_all\n%s", ""); - + char *data = NULL; size_t sz = 0, asz = 0; @@ -4713,7 +4718,7 @@ static int cpuview_proc_stat(const char *cg, const char *cpuset, struct cpuacct_ lxcfs_v("idle_sum before: %lu\n", idle_sum); idle_sum = idle_sum > delta ? idle_sum - delta : 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; @@ -5092,11 +5097,12 @@ static int proc_stat_read(char *buf, size_t size, off_t offset, * account as well. If someone has a clever solution for this please send a * patch! */ -static unsigned long get_reaper_busy(pid_t task) +static double get_reaper_busy(pid_t task) { pid_t initpid = lookup_initpid_in_store(task); char *cgroup = NULL, *usage_str = NULL; unsigned long usage = 0; + double res = 0; if (initpid <= 0) return 0; @@ -5108,12 +5114,12 @@ static unsigned long get_reaper_busy(pid_t task) if (!cgfs_get_value("cpuacct", cgroup, "cpuacct.usage", &usage_str)) goto out; usage = strtoul(usage_str, NULL, 10); - usage /= 1000000000; + res = (double)usage / 1000000000; out: free(cgroup); free(usage_str); - return usage; + return res; } #if RELOADTEST @@ -5137,10 +5143,10 @@ static int proc_uptime_read(char *buf, size_t size, off_t offset, { struct fuse_context *fc = fuse_get_context(); struct file_info *d = (struct file_info *)fi->fh; - unsigned long int busytime = get_reaper_busy(fc->pid); + double busytime = get_reaper_busy(fc->pid); char *cache = d->buf; ssize_t total_len = 0; - uint64_t idletime, reaperage; + double idletime, reaperage; #if RELOADTEST iwashere(); @@ -5165,7 +5171,7 @@ static int proc_uptime_read(char *buf, size_t size, off_t offset, if (reaperage >= busytime) idletime = reaperage - busytime; - total_len = snprintf(d->buf, d->buflen, "%"PRIu64".00 %"PRIu64".00\n", reaperage, idletime); + total_len = snprintf(d->buf, d->buflen, "%.2lf %.2lf\n", reaperage, idletime); if (total_len < 0 || total_len >= d->buflen){ lxcfs_error("%s\n", "failed to write to cache"); return 0; @@ -6398,4 +6404,4 @@ static void __attribute__((destructor)) free_subsystems(void) if (cgroup_mount_ns_fd >= 0) close(cgroup_mount_ns_fd); -} \ No newline at end of file +}
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel