X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvserver-stat.c;h=e282e104e0a62bedde0f37d8f3fb0a21760a4ce3;hb=b611393a98072ffa745720ce3c1e7b3d1f851e07;hp=e81c38d4b24b5d7e4131ea7b96d3c487775a77f1;hpb=c6d15ec933126d74645ffbe0cfd2e8e931664e0d;p=util-vserver.git diff --git a/src/vserver-stat.c b/src/vserver-stat.c index e81c38d..e282e10 100644 --- a/src/vserver-stat.c +++ b/src/vserver-stat.c @@ -315,9 +315,10 @@ registerXidCgroups(struct Vector *vec, struct process_info *process) ssize_t cgroup_len, name_len; unsigned long long rss = 0; char *endptr; - size_t len; - uint64_t stime_total, utime_total; + ssize_t len; + unsigned long long stime_total, utime_total; int per_ss = 0; + FILE *fp; if (vc_virt_stat(xid, &vstat) == -1) { @@ -334,8 +335,14 @@ registerXidCgroups(struct Vector *vec, struct process_info *process) } if ((fd = open(DEFAULTCONFDIR "/cgroup/mnt", O_RDONLY)) == -1) { - strcpy(cgroup, "/dev/cgroup/"); - cgroup_len = sizeof("/dev/cgroup"); + if (utilvserver_isDirectory("/sys/fs/cgroup", false)) { + strcpy(cgroup, "/sys/fs/cgroup/"); + cgroup_len = sizeof("/sys/fs/cgroup"); + per_ss = 1; + } else { + strcpy(cgroup, "/dev/cgroup/"); + cgroup_len = sizeof("/dev/cgroup"); + } } else { cgroup_len = read(fd, cgroup, sizeof(cgroup)); @@ -389,7 +396,7 @@ registerXidCgroups(struct Vector *vec, struct process_info *process) char *dir = strrchr(vhi_name, '/'); if (dir == NULL) { WRITE_MSG(2, "invalid context name: "); - WRITE_STR(2, dir); + WRITE_STR(2, vhi_name); WRITE_MSG(2, "\n"); return; } @@ -416,27 +423,35 @@ registerXidCgroups(struct Vector *vec, struct process_info *process) close(fd); } - if ((cgroup_len + name_len + sizeof("/memory/memory.usage_in_bytes")) > sizeof(filename)) { + if ((cgroup_len + name_len + sizeof("/memory/memory.stat")) > sizeof(filename)) { WRITE_MSG(2, "cgroup name too long: "); WRITE_STR(2, cgroup); WRITE_MSG(2, "\n"); return; } - snprintf(filename, sizeof(filename), "%s%s%s/memory.usage_in_bytes", cgroup, (per_ss ? "/memory" : ""), name); + snprintf(filename, sizeof(filename), "%s%s%s/memory.stat", cgroup, (per_ss ? "/memory" : ""), name); - if ((fd = open(filename, O_RDONLY)) == -1) - perror("open(memory.usage_in_bytes)"); + if ((fp = fopen(filename, "r")) == NULL) + perror("open(memory.stat)"); else { - if (read(fd, buf, sizeof(buf)) == -1) { - perror("read(memory.usage_in_bytes)"); - return; - } - close(fd); - if ((rss = strtoull(buf, &endptr, 0)) == ULLONG_MAX || - (*endptr != '\n' && *endptr != '\0')) { - perror("strtoull(memory.usage_in_bytes)"); - return; + unsigned long long _rss = 0, _mapped_file = 0; + while (fgets(buf, sizeof(buf), fp) != NULL) { + if (strncmp(buf, "rss ", 4) == 0) { + if ((_rss = strtoull(buf + 4, &endptr, 0)) == ULLONG_MAX || + (*endptr != '\n' && *endptr != '\0')) { + perror("strtoull(memory.stat:rss)"); + return; + } + } + else if (strncmp(buf, "mapped_file ", 12) == 0) { + if ((_mapped_file = strtoull(buf + 12, &endptr, 0)) == ULLONG_MAX || + (*endptr != '\n' && *endptr != '\0')) { + perror("strtoull(memory.stat:mapped_file)"); + return; + } + } } + rss = _rss + _mapped_file; } snprintf(filename, sizeof(filename), "%s%s%s/cpuacct.stat", cgroup, (per_ss ? "/cpuacct" : ""), name);