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:
parent
c09a14e5b4
commit
9549a8967a
@ -2835,6 +2835,7 @@ virResctrlMonitorCreate;
|
|||||||
virResctrlMonitorDeterminePath;
|
virResctrlMonitorDeterminePath;
|
||||||
virResctrlMonitorGetCacheOccupancy;
|
virResctrlMonitorGetCacheOccupancy;
|
||||||
virResctrlMonitorGetID;
|
virResctrlMonitorGetID;
|
||||||
|
virResctrlMonitorGetStats;
|
||||||
virResctrlMonitorNew;
|
virResctrlMonitorNew;
|
||||||
virResctrlMonitorRemove;
|
virResctrlMonitorRemove;
|
||||||
virResctrlMonitorSetAlloc;
|
virResctrlMonitorSetAlloc;
|
||||||
|
@ -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;
|
||||||
|
@ -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,21 +2744,23 @@ 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;
|
||||||
|
|
||||||
rv = virFileReadValueUint(&val, "%s/%s/%s", datapath,
|
for (i = 0; resources[i]; i++) {
|
||||||
ent->d_name, resource);
|
rv = virFileReadValueUint(&val, "%s/%s/%s", datapath,
|
||||||
if (rv == -2) {
|
ent->d_name, resources[i]);
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
if (rv == -2) {
|
||||||
_("File '%s/%s/%s' does not exist."),
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
datapath, ent->d_name, resource);
|
_("File '%s/%s/%s' does not exist."),
|
||||||
|
datapath, ent->d_name, resources[i]);
|
||||||
|
}
|
||||||
|
if (rv < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (VIR_APPEND_ELEMENT(stat->vals, stat->nvals, val) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virStringListAdd(&stat->features, resources[i]) < 0)
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
if (rv < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (VIR_APPEND_ELEMENT(stat->vals, stat->nvals, val) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virStringListAdd(&stat->features, resource) < 0)
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user