1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

util: Extend virresctl API to retrieve multiple monitor statistics

Export virResctrlMonitorGetStats and make
virResctrlMonitorGetCacheOccupancy obsoleted.

Signed-off-by: Wang Huaqiang <huaqiang.wang@intel.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Wang Huaqiang 2019-06-11 11:31:14 +08:00 committed by Michal Privoznik
parent c09a14e5b4
commit 9549a8967a
4 changed files with 58 additions and 28 deletions

View File

@ -2835,6 +2835,7 @@ virResctrlMonitorCreate;
virResctrlMonitorDeterminePath; virResctrlMonitorDeterminePath;
virResctrlMonitorGetCacheOccupancy; virResctrlMonitorGetCacheOccupancy;
virResctrlMonitorGetID; virResctrlMonitorGetID;
virResctrlMonitorGetStats;
virResctrlMonitorNew; virResctrlMonitorNew;
virResctrlMonitorRemove; virResctrlMonitorRemove;
virResctrlMonitorSetAlloc; virResctrlMonitorSetAlloc;

View File

@ -20710,6 +20710,7 @@ qemuDomainFreeResctrlMonData(virQEMUResctrlMonDataPtr resdata)
/** /**
* qemuDomainGetResctrlMonData: * qemuDomainGetResctrlMonData:
* @dom: Pointer for the domain that the resctrl monitors reside in * @dom: Pointer for the domain that the resctrl monitors reside in
* @driver: Pointer to qemu driver
* @resdata: Pointer of virQEMUResctrlMonDataPtr pointer for receiving the * @resdata: Pointer of virQEMUResctrlMonDataPtr pointer for receiving the
* virQEMUResctrlMonDataPtr array. Caller is responsible for * virQEMUResctrlMonDataPtr array. Caller is responsible for
* freeing the array. * freeing the array.
@ -20727,16 +20728,32 @@ qemuDomainFreeResctrlMonData(virQEMUResctrlMonDataPtr resdata)
* Returns -1 on failure, or 0 on success. * Returns -1 on failure, or 0 on success.
*/ */
static int static int
qemuDomainGetResctrlMonData(virDomainObjPtr dom, qemuDomainGetResctrlMonData(virQEMUDriverPtr driver,
virDomainObjPtr dom,
virQEMUResctrlMonDataPtr **resdata, virQEMUResctrlMonDataPtr **resdata,
size_t *nresdata, size_t *nresdata,
virResctrlMonitorType tag) virResctrlMonitorType tag)
{ {
virDomainResctrlDefPtr resctrl = NULL; virDomainResctrlDefPtr resctrl = NULL;
virQEMUResctrlMonDataPtr res = NULL; virQEMUResctrlMonDataPtr res = NULL;
char **features = NULL;
virCapsPtr caps = NULL;
size_t i = 0; size_t i = 0;
size_t j = 0; size_t j = 0;
caps = virQEMUDriverGetCapabilities(driver, false);
if (tag == VIR_RESCTRL_MONITOR_TYPE_CACHE) {
features = caps->host.cache.monitor->features;
} else {
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
_("Unsupported resctrl monitor type"));
return -1;
}
if (virStringListLength((const char * const *)features) == 0)
return 0;
for (i = 0; i < dom->def->nresctrls; i++) { for (i = 0; i < dom->def->nresctrls; i++) {
resctrl = dom->def->resctrls[i]; resctrl = dom->def->resctrls[i];
@ -20763,9 +20780,8 @@ qemuDomainGetResctrlMonData(virDomainObjPtr dom,
if (VIR_STRDUP(res->name, virResctrlMonitorGetID(monitor)) < 0) if (VIR_STRDUP(res->name, virResctrlMonitorGetID(monitor)) < 0)
goto error; goto error;
if (virResctrlMonitorGetCacheOccupancy(monitor, if (virResctrlMonitorGetStats(monitor, (const char **)features,
&res->stats, &res->stats, &res->nstats) < 0)
&res->nstats) < 0)
goto error; goto error;
if (VIR_APPEND_ELEMENT(*resdata, *nresdata, res) < 0) if (VIR_APPEND_ELEMENT(*resdata, *nresdata, res) < 0)
@ -20782,7 +20798,8 @@ qemuDomainGetResctrlMonData(virDomainObjPtr dom,
static int static int
qemuDomainGetStatsCpuCache(virDomainObjPtr dom, qemuDomainGetStatsCpuCache(virQEMUDriverPtr driver,
virDomainObjPtr dom,
virDomainStatsRecordPtr record, virDomainStatsRecordPtr record,
int *maxparams) int *maxparams)
{ {
@ -20796,7 +20813,7 @@ qemuDomainGetStatsCpuCache(virDomainObjPtr dom,
if (!virDomainObjIsActive(dom)) if (!virDomainObjIsActive(dom))
return 0; return 0;
if (qemuDomainGetResctrlMonData(dom, &resdata, &nresdata, if (qemuDomainGetResctrlMonData(driver, dom, &resdata, &nresdata,
VIR_RESCTRL_MONITOR_TYPE_CACHE) < 0) VIR_RESCTRL_MONITOR_TYPE_CACHE) < 0)
goto cleanup; goto cleanup;
@ -20897,7 +20914,7 @@ qemuDomainGetStatsCpuCgroup(virDomainObjPtr dom,
static int static int
qemuDomainGetStatsCpu(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, qemuDomainGetStatsCpu(virQEMUDriverPtr driver,
virDomainObjPtr dom, virDomainObjPtr dom,
virDomainStatsRecordPtr record, virDomainStatsRecordPtr record,
int *maxparams, int *maxparams,
@ -20906,7 +20923,7 @@ qemuDomainGetStatsCpu(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
if (qemuDomainGetStatsCpuCgroup(dom, record, maxparams) < 0) if (qemuDomainGetStatsCpuCgroup(dom, record, maxparams) < 0)
return -1; return -1;
if (qemuDomainGetStatsCpuCache(dom, record, maxparams) < 0) if (qemuDomainGetStatsCpuCache(driver, dom, record, maxparams) < 0)
return -1; return -1;
return 0; return 0;

View File

@ -2669,8 +2669,7 @@ virResctrlMonitorStatsSorter(const void *a,
* virResctrlMonitorGetStats * virResctrlMonitorGetStats
* *
* @monitor: The monitor that the statistic data will be retrieved from. * @monitor: The monitor that the statistic data will be retrieved from.
* @resource: The name for resource name. 'llc_occupancy' for cache resource. * @resources: A string list for the monitor feature names.
* "mbm_total_bytes" and "mbm_local_bytes" for memory bandwidth resource.
* @stats: Pointer of of virResctrlMonitorStatsPtr array for holding cache or * @stats: Pointer of of virResctrlMonitorStatsPtr array for holding cache or
* memory bandwidth usage data. * memory bandwidth usage data.
* @nstats: A size_t pointer to hold the returned array length of @stats * @nstats: A size_t pointer to hold the returned array length of @stats
@ -2679,14 +2678,15 @@ virResctrlMonitorStatsSorter(const void *a,
* *
* Returns 0 on success, -1 on error. * Returns 0 on success, -1 on error.
*/ */
static int int
virResctrlMonitorGetStats(virResctrlMonitorPtr monitor, virResctrlMonitorGetStats(virResctrlMonitorPtr monitor,
const char *resource, const char **resources,
virResctrlMonitorStatsPtr **stats, virResctrlMonitorStatsPtr **stats,
size_t *nstats) size_t *nstats)
{ {
int rv = -1; int rv = -1;
int ret = -1; int ret = -1;
size_t i = 0;
unsigned int val = 0; unsigned int val = 0;
DIR *dirp = NULL; DIR *dirp = NULL;
char *datapath = NULL; char *datapath = NULL;
@ -2744,12 +2744,13 @@ virResctrlMonitorGetStats(virResctrlMonitorPtr monitor,
if (virStrToLong_uip(node_id, NULL, 0, &stat->id) < 0) if (virStrToLong_uip(node_id, NULL, 0, &stat->id) < 0)
goto cleanup; goto cleanup;
for (i = 0; resources[i]; i++) {
rv = virFileReadValueUint(&val, "%s/%s/%s", datapath, rv = virFileReadValueUint(&val, "%s/%s/%s", datapath,
ent->d_name, resource); ent->d_name, resources[i]);
if (rv == -2) { if (rv == -2) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("File '%s/%s/%s' does not exist."), _("File '%s/%s/%s' does not exist."),
datapath, ent->d_name, resource); datapath, ent->d_name, resources[i]);
} }
if (rv < 0) if (rv < 0)
goto cleanup; goto cleanup;
@ -2757,8 +2758,9 @@ virResctrlMonitorGetStats(virResctrlMonitorPtr monitor,
if (VIR_APPEND_ELEMENT(stat->vals, stat->nvals, val) < 0) if (VIR_APPEND_ELEMENT(stat->vals, stat->nvals, val) < 0)
goto cleanup; goto cleanup;
if (virStringListAdd(&stat->features, resource) < 0) if (virStringListAdd(&stat->features, resources[i]) < 0)
goto cleanup; goto cleanup;
}
if (VIR_APPEND_ELEMENT(*stats, *nstats, stat) < 0) if (VIR_APPEND_ELEMENT(*stats, *nstats, stat) < 0)
goto cleanup; goto cleanup;
@ -2808,6 +2810,10 @@ virResctrlMonitorGetCacheOccupancy(virResctrlMonitorPtr monitor,
virResctrlMonitorStatsPtr **stats, virResctrlMonitorStatsPtr **stats,
size_t *nstats) size_t *nstats)
{ {
return virResctrlMonitorGetStats(monitor, "llc_occupancy", int ret = -1;
stats, nstats); const char *features[2] = {"llc_occupancy", NULL};
ret = virResctrlMonitorGetStats(monitor, features, stats, nstats);
return ret;
} }

View File

@ -234,6 +234,12 @@ virResctrlMonitorSetAlloc(virResctrlMonitorPtr monitor,
int int
virResctrlMonitorRemove(virResctrlMonitorPtr monitor); virResctrlMonitorRemove(virResctrlMonitorPtr monitor);
int
virResctrlMonitorGetStats(virResctrlMonitorPtr monitor,
const char **resources,
virResctrlMonitorStatsPtr **stats,
size_t *nstats);
int int
virResctrlMonitorGetCacheOccupancy(virResctrlMonitorPtr monitor, virResctrlMonitorGetCacheOccupancy(virResctrlMonitorPtr monitor,
virResctrlMonitorStatsPtr **stats, virResctrlMonitorStatsPtr **stats,