diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index b809c35cf87bebf1d813828a7cfa9540a8e5ce80..ddb71793076db18a33a5b71dd58574b3fd68cdd4 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -1356,6 +1356,25 @@ vzDomainInterfaceStats(virDomainPtr domain, return ret; } +static int +vzDomainMemoryStats(virDomainPtr domain, + virDomainMemoryStatPtr stats, + unsigned int nr_stats, + unsigned int flags) +{ + virDomainObjPtr dom = NULL; + int ret = -1; + + virCheckFlags(0, -1); + if (!(dom = vzDomObjFromDomainRef(domain))) + return -1; + + ret = prlsdkGetMemoryStats(dom, stats, nr_stats); + virDomainObjEndAPI(&dom); + + return ret; +} + static virHypervisorDriver vzDriver = { .name = "vz", .connectOpen = vzConnectOpen, /* 0.10.0 */ @@ -1408,6 +1427,7 @@ static virHypervisorDriver vzDriver = { .domainBlockStats = vzDomainBlockStats, /* 1.3.0 */ .domainBlockStatsFlags = vzDomainBlockStatsFlags, /* 1.3.0 */ .domainInterfaceStats = vzDomainInterfaceStats, /* 1.3.0 */ + .domainMemoryStats = vzDomainMemoryStats, /* 1.3.0 */ }; static virConnectDriver vzConnectDriver = { diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 74f0488fa07c114fc31fb89ab89ac63d94dd0661..fb88ca0d3a1e95b31e6d6540955695eaa5629932 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -3881,3 +3881,64 @@ prlsdkGetVcpuStats(virDomainObjPtr dom, int idx, unsigned long long *vtime) VIR_FREE(name); return ret; } + +int +prlsdkGetMemoryStats(virDomainObjPtr dom, + virDomainMemoryStatPtr stats, + unsigned int nr_stats) +{ + int ret = -1; + long long v = 0, t = 0, u = 0; + size_t i = 0; + +#define PRLSDK_GET_COUNTER(NAME, VALUE) \ + if (prlsdkGetStatsParam(dom, NAME, &VALUE) < 0) \ + goto cleanup; \ + +#define PRLSDK_MEMORY_STAT_SET(TAG, VALUE) \ + if (i < nr_stats) { \ + stats[i].tag = (TAG); \ + stats[i].val = (VALUE); \ + i++; \ + } + + i = 0; + + // count to kb + PRLSDK_GET_COUNTER("guest.ram.swap_in", v) + if (v != -1) + PRLSDK_MEMORY_STAT_SET(VIR_DOMAIN_MEMORY_STAT_SWAP_IN, v << 12) + + PRLSDK_GET_COUNTER("guest.ram.swap_out", v) + if (v != -1) + PRLSDK_MEMORY_STAT_SET(VIR_DOMAIN_MEMORY_STAT_SWAP_OUT, v << 12) + + PRLSDK_GET_COUNTER("guest.ram.minor_fault", v) + if (v != -1) + PRLSDK_MEMORY_STAT_SET(VIR_DOMAIN_MEMORY_STAT_MINOR_FAULT, v) + + PRLSDK_GET_COUNTER("guest.ram.major_fault", v) + if (v != -1) + PRLSDK_MEMORY_STAT_SET(VIR_DOMAIN_MEMORY_STAT_MAJOR_FAULT, v) + + PRLSDK_GET_COUNTER("guest.ram.total", v) + if (v != -1) + PRLSDK_MEMORY_STAT_SET(VIR_DOMAIN_MEMORY_STAT_AVAILABLE, v << 10) + + PRLSDK_GET_COUNTER("guest.ram.balloon_actual", v) + if (v != -1) + PRLSDK_MEMORY_STAT_SET(VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON, v << 10) + + PRLSDK_GET_COUNTER("guest.ram.usage", u) + PRLSDK_GET_COUNTER("guest.ram.total", t) + if (u != -1 && t != -1) + PRLSDK_MEMORY_STAT_SET(VIR_DOMAIN_MEMORY_STAT_UNUSED, (t - u) << 10) + +#undef PRLSDK_GET_COUNTER +#undef PRLSDK_MEMORY_STAT_SET + + ret = i; + cleanup: + + return ret; +} diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h index ca38c591bcf320d8bda8bc3c1f1a430c69d8e8dc..ebe4591b271fb48c66a992b5d3d399856ecb40da 100644 --- a/src/vz/vz_sdk.h +++ b/src/vz/vz_sdk.h @@ -74,3 +74,5 @@ int prlsdkGetNetStats(virDomainObjPtr dom, const char *path, virDomainInterfaceStatsPtr stats); int prlsdkGetVcpuStats(virDomainObjPtr dom, int idx, unsigned long long *time); +int +prlsdkGetMemoryStats(virDomainObjPtr dom, virDomainMemoryStatPtr stats, unsigned int nr_stats);