From: Martin Kletzander Date: Tue, 24 Jan 2012 13:25:05 +0000 (+0100) Subject: Added RSS reporting X-Git-Tag: v0.9.10-rc1~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3d93706d0d440ec1751d4465a65f1ccd978f9f71;p=thirdparty%2Flibvirt.git Added RSS reporting Added RSS information gathering into qemuMemoryStats into qemu driver and the reporting into virsh dommemstat. --- diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 2b4adda6dc..cca6a5ddc0 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -884,11 +884,16 @@ typedef enum { /* Current balloon value (in KB). */ VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON = 6, + + /* Resident Set Size of the process running the domain. This value + * is in kB */ + VIR_DOMAIN_MEMORY_STAT_RSS = 7, + /* * The number of statistics supported by this version of the interface. * To add new statistics, add them to the enum and increase this value. */ - VIR_DOMAIN_MEMORY_STAT_NR = 7, + VIR_DOMAIN_MEMORY_STAT_NR = 8, #ifdef VIR_ENUM_SENTINELS VIR_DOMAIN_MEMORY_STAT_LAST = VIR_DOMAIN_MEMORY_STAT_NR diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 40bcba4dca..1daf4fca7c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -8035,7 +8035,7 @@ qemudDomainMemoryStats (virDomainPtr dom, { struct qemud_driver *driver = dom->conn->privateData; virDomainObjPtr vm; - unsigned int ret = -1; + int ret = -1; virCheckFlags(0, -1); @@ -8054,14 +8054,27 @@ qemudDomainMemoryStats (virDomainPtr dom, if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0) goto cleanup; - if (virDomainObjIsActive(vm)) { + if (!virDomainObjIsActive(vm)) { + qemuReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("domain is not running")); + } else { qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjEnterMonitor(driver, vm); ret = qemuMonitorGetMemoryStats(priv->mon, stats, nr_stats); qemuDomainObjExitMonitor(driver, vm); - } else { - qemuReportError(VIR_ERR_OPERATION_INVALID, - "%s", _("domain is not running")); + + if (ret >= 0 && ret < nr_stats) { + long rss; + if (qemudGetProcessInfo(NULL, NULL, &rss, vm->pid, 0) < 0) { + qemuReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("cannot get RSS for domain")); + } else { + stats[ret].tag = VIR_DOMAIN_MEMORY_STAT_RSS; + stats[ret].val = rss; + ret++; + } + + } } if (qemuDomainObjEndJob(driver, vm) == 0) diff --git a/tools/virsh.c b/tools/virsh.c index af781025eb..73c1ebe845 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -2052,6 +2052,8 @@ cmdDomMemStat(vshControl *ctl, const vshCmd *cmd) vshPrint (ctl, "available %llu\n", stats[i].val); if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON) vshPrint (ctl, "actual %llu\n", stats[i].val); + if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_RSS) + vshPrint (ctl, "rss %llu\n", stats[i].val); } virDomainFree(dom);