The commit is pushed to "branch-rh7-3.10.0-123.1.2-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git after rh7-3.10.0-123.1.2.vz7.5.7 ------> commit 1105cbff976808b0e60231ae407ba309963ff289 Author: Vladimir Davydov <vdavy...@parallels.com> Date: Thu May 28 18:01:37 2015 +0400
fairsched: switch methods showing stats from numeric id to name Patchset description: Currently, cpu stats are broken for UUID-named CTs. First, reading /proc/stat from inside a container or /proc/vz/vestat on the host fails with ENOENT if there is a UUID-named CT. Patch 1 fixes that. Second, there is no new interface for getting loadavg for UUID-named CTs, which would be a successor of the legacy VZCTL_GET_CPU_STAT ioctl. Patch 2 adds cpu.proc.loadavg that mimics behavior of /proc/loadavg. This patch description: fairsched_get_cpu_stat, fairsched_get_cpu_avenrun, and fairsched_show_stat can be called on UUID-named containers (e.g. reading /proc/stat inside a CT or reading /proc/vz/vestat on the host). Currently, they return ENOENT for such containers, because they try to open cgroup with name equal to the passed ID while UUID-named container cgroups are named not by ID, but by UUID. This patch makes them accept a string name instead of a numeric id. All the function calling them now pass ve->ve_name instead of ve->veid. As a side effect, after this patch is applied, VZCTL_GET_CPU_STAT ioctl will work on UUID-named containers provided the caller passes ve.legacy_veid. https://jira.sw.ru/browse/PSBM-32284 Signed-off-by: Vladimir Davydov <vdavy...@parallels.com> --- fs/proc/stat.c | 2 +- include/linux/fairsched.h | 12 ++++++------ kernel/fairsched.c | 24 ++++++++++++------------ kernel/ve/vecalls.c | 25 +++++++++---------------- 4 files changed, 28 insertions(+), 35 deletions(-) diff --git a/fs/proc/stat.c b/fs/proc/stat.c index 34f318a..89eb04e 100644 --- a/fs/proc/stat.c +++ b/fs/proc/stat.c @@ -98,7 +98,7 @@ static int show_stat(struct seq_file *p, void *v) ve = get_exec_env(); if (!ve_is_super(ve)) { int ret; - ret = fairsched_show_stat(p, ve->veid); + ret = fairsched_show_stat(ve_name(ve), p); if (ret != -ENOSYS) return ret; } diff --git a/include/linux/fairsched.h b/include/linux/fairsched.h index c944bed..568c25a 100644 --- a/include/linux/fairsched.h +++ b/include/linux/fairsched.h @@ -53,24 +53,24 @@ int fairsched_new_node(int id, unsigned int vcpus); int fairsched_move_task(int id, struct task_struct *tsk); void fairsched_drop_node(int id, int leave); -int fairsched_get_cpu_stat(int id, struct kernel_cpustat *kstat); +int fairsched_get_cpu_stat(const char *name, struct kernel_cpustat *kstat); int cpu_cgroup_get_avenrun(struct cgroup *cgrp, unsigned long *avenrun); -int fairsched_get_cpu_avenrun(int id, unsigned long *avenrun); +int fairsched_get_cpu_avenrun(const char *name, unsigned long *avenrun); struct cftype; int cpu_cgroup_proc_stat(struct cgroup *cgrp, struct cftype *cft, struct seq_file *p); -int fairsched_show_stat(struct seq_file *p, int id); +int fairsched_show_stat(const char *name, struct seq_file *p); #else /* CONFIG_VZ_FAIRSCHED */ static inline int fairsched_new_node(int id, unsigned int vcpus) { return 0; } static inline int fairsched_move_task(int id, struct task_struct *tsk) { return 0; } static inline void fairsched_drop_node(int id, int leave) { } -static inline int fairsched_show_stat(struct seq_file *p, int id) { return -ENOSYS; } -static inline int fairsched_get_cpu_avenrun(int id, unsigned long *avenrun) { return -ENOSYS; } -static inline int fairsched_get_cpu_stat(int id, struct kernel_cpustat *kstat) { return -ENOSYS; } +static inline int fairsched_show_stat(const char *name, struct seq_file *p) { return -ENOSYS; } +static inline int fairsched_get_cpu_avenrun(const char *name, unsigned long *avenrun) { return -ENOSYS; } +static inline int fairsched_get_cpu_stat(const char *name, struct kernel_cpustat *kstat) { return -ENOSYS; } #endif /* CONFIG_VZ_FAIRSCHED */ diff --git a/kernel/fairsched.c b/kernel/fairsched.c index 2fd39cd..7fe93d2 100644 --- a/kernel/fairsched.c +++ b/kernel/fairsched.c @@ -715,14 +715,14 @@ static struct file_operations proc_fairsched_operations = { .release = fairsched_seq_release }; -int fairsched_show_stat(struct seq_file *p, int id) +int fairsched_show_stat(const char *name, struct seq_file *p) { struct cgroup *cgrp; int err; - cgrp = ve_cgroup_open(root_node.cpu, 0, id); - if (IS_ERR(cgrp)) - return PTR_ERR(cgrp); + cgrp = cgroup_kernel_open(root_node.cpu, 0, name); + if (IS_ERR_OR_NULL(cgrp)) + return cgrp ? PTR_ERR(cgrp) : -ENOENT; err = cpu_cgroup_proc_stat(cgrp, NULL, p); cgroup_kernel_close(cgrp); @@ -730,14 +730,14 @@ int fairsched_show_stat(struct seq_file *p, int id) return err; } -int fairsched_get_cpu_avenrun(int id, unsigned long *avenrun) +int fairsched_get_cpu_avenrun(const char *name, unsigned long *avenrun) { struct cgroup *cgrp; int err; - cgrp = ve_cgroup_open(root_node.cpu, 0, fairsched_id(id)); - if (IS_ERR(cgrp)) - return PTR_ERR(cgrp); + cgrp = cgroup_kernel_open(root_node.cpu, 0, name); + if (IS_ERR_OR_NULL(cgrp)) + return cgrp ? PTR_ERR(cgrp) : -ENOENT; err = cpu_cgroup_get_avenrun(cgrp, avenrun); cgroup_kernel_close(cgrp); @@ -746,13 +746,13 @@ int fairsched_get_cpu_avenrun(int id, unsigned long *avenrun) } EXPORT_SYMBOL(fairsched_get_cpu_avenrun); -int fairsched_get_cpu_stat(int id, struct kernel_cpustat *kstat) +int fairsched_get_cpu_stat(const char *name, struct kernel_cpustat *kstat) { struct cgroup *cgrp; - cgrp = ve_cgroup_open(root_node.cpu, 0, fairsched_id(id)); - if (IS_ERR(cgrp)) - return PTR_ERR(cgrp); + cgrp = cgroup_kernel_open(root_node.cpu, 0, name); + if (IS_ERR_OR_NULL(cgrp)) + return cgrp ? PTR_ERR(cgrp) : -ENOENT; cpu_cgroup_get_stat(cgrp, kstat); cgroup_kernel_close(cgrp); diff --git a/kernel/ve/vecalls.c b/kernel/ve/vecalls.c index 8390843..73ae9ef 100644 --- a/kernel/ve/vecalls.c +++ b/kernel/ve/vecalls.c @@ -104,27 +104,23 @@ static int ve_get_cpu_stat(envid_t veid, struct vz_cpu_stat __user *buf) if (!ve_is_super(get_exec_env()) && (veid != get_exec_env()->veid)) return -EPERM; - if (veid == 0) + ve = get_ve_by_id(veid); + if (!ve) return -ESRCH; + retval = -ENOMEM; vstat = kzalloc(sizeof(*vstat), GFP_KERNEL); if (!vstat) - return -ENOMEM; + goto out_put_ve; - retval = fairsched_get_cpu_stat(veid, &kstat); + retval = fairsched_get_cpu_stat(ve->ve_name, &kstat); if (retval) goto out_free; - retval = fairsched_get_cpu_avenrun(veid, avenrun); + retval = fairsched_get_cpu_avenrun(ve->ve_name, avenrun); if (retval) goto out_free; - retval = -ESRCH; - mutex_lock(&ve_list_lock); - ve = __find_ve_by_id(veid); - if (ve == NULL) - goto out_unlock; - vstat->user_jif += (unsigned long)cputime64_to_clock_t(kstat.cpustat[CPUTIME_USER]); vstat->nice_jif += (unsigned long)cputime64_to_clock_t(kstat.cpustat[CPUTIME_NICE]); vstat->system_jif += (unsigned long)cputime64_to_clock_t(kstat.cpustat[CPUTIME_SYSTEM]); @@ -139,18 +135,15 @@ static int ve_get_cpu_stat(envid_t veid, struct vz_cpu_stat __user *buf) vstat->avenrun[i].val_int = LOAD_INT(tmp); vstat->avenrun[i].val_frac = LOAD_FRAC(tmp); } - mutex_unlock(&ve_list_lock); retval = 0; if (copy_to_user(buf, vstat, sizeof(*vstat))) retval = -EFAULT; out_free: kfree(vstat); +out_put_ve: + put_ve(ve); return retval; - -out_unlock: - mutex_unlock(&ve_list_lock); - goto out_free; } static int real_setdevperms(envid_t veid, unsigned type, @@ -800,7 +793,7 @@ static int vestat_seq_show(struct seq_file *m, void *v) if (ve == get_ve0()) return 0; - ret = fairsched_get_cpu_stat(ve->veid, &kstat); + ret = fairsched_get_cpu_stat(ve->ve_name, &kstat); if (ret) return ret; _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel