[libvirt] [PATCH v2 1/2] Added RSS information gathering into qemudGetProcessInfo
Daniel Veillard
veillard at redhat.com
Fri Feb 3 13:28:48 UTC 2012
On Tue, Jan 24, 2012 at 02:25:04PM +0100, Martin Kletzander wrote:
> One more parameter added into the function parsing /proc/<pid>/stat
> and the call of the function is fixed as well.
> ---
> v2:
> - correction of the format in fscanf in qemudGetProcessInfo
>
> src/qemu/qemu_driver.c | 25 ++++++++++++++++++-------
> 1 files changed, 18 insertions(+), 7 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 608e82a..6600afd 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -1049,12 +1049,13 @@ cleanup:
>
>
> static int
> -qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, int pid,
> - int tid)
> +qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss,
> + int pid, int tid)
> {
> char *proc;
> FILE *pidinfo;
> unsigned long long usertime, systime;
> + long rss;
> int cpu;
> int ret;
>
> @@ -1071,6 +1072,8 @@ qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, int pid,
> *cpuTime = 0;
> if (lastCpu)
> *lastCpu = 0;
> + if (vm_rss)
> + *vm_rss = 0;
> VIR_FREE(proc);
> return 0;
> }
> @@ -1082,10 +1085,10 @@ qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, int pid,
> /* pid -> stime */
> "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %llu %llu"
> /* cutime -> endcode */
> - "%*d %*d %*d %*d %*d %*u %*u %*d %*u %*u %*u %*u"
> + "%*d %*d %*d %*d %*d %*d %*u %*u %ld %*u %*u %*u"
> /* startstack -> processor */
> "%*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*d %d",
> - &usertime, &systime, &cpu) != 3) {
> + &usertime, &systime, &rss, &cpu) != 4) {
> VIR_FORCE_FCLOSE(pidinfo);
> VIR_WARN("cannot parse process status data");
> errno = -EINVAL;
> @@ -1102,9 +1105,16 @@ qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, int pid,
> if (lastCpu)
> *lastCpu = cpu;
>
> + /* We got pages
> + * We want kiloBytes
> + * _SC_PAGESIZE is page size in Bytes
> + * So calculate, but first lower the pagesize so we don't get overflow */
> + if (vm_rss)
> + *vm_rss = rss * (sysconf(_SC_PAGESIZE) >> 10);
>
> - VIR_DEBUG("Got status for %d/%d user=%llu sys=%llu cpu=%d",
> - pid, tid, usertime, systime, cpu);
> +
> + VIR_DEBUG("Got status for %d/%d user=%llu sys=%llu cpu=%d rss=%ld",
> + pid, tid, usertime, systime, cpu, rss);
>
> VIR_FORCE_FCLOSE(pidinfo);
>
> @@ -2066,7 +2076,7 @@ static int qemudDomainGetInfo(virDomainPtr dom,
> if (!virDomainObjIsActive(vm)) {
> info->cpuTime = 0;
> } else {
> - if (qemudGetProcessInfo(&(info->cpuTime), NULL, vm->pid, 0) < 0) {
> + if (qemudGetProcessInfo(&(info->cpuTime), NULL, NULL, vm->pid, 0) < 0) {
> qemuReportError(VIR_ERR_OPERATION_FAILED, "%s",
> _("cannot read cputime for domain"));
> goto cleanup;
> @@ -3648,6 +3658,7 @@ qemudDomainGetVcpus(virDomainPtr dom,
> if (priv->vcpupids != NULL &&
> qemudGetProcessInfo(&(info[i].cpuTime),
> &(info[i].cpu),
> + NULL,
> vm->pid,
> priv->vcpupids[i]) < 0) {
> virReportSystemError(errno, "%s",
Actually I prefer that version :-)
ACK to that one instead !
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list