static int
qemuDomainGetStatsCheckSupport(unsigned int *stats,
- bool enforce)
+ bool enforce,
+ virDomainObj *vm)
{
+ qemuDomainObjPrivate *priv = vm->privateData;
unsigned int supportedstats = 0;
size_t i;
- for (i = 0; qemuDomainGetStatsWorkers[i].func; i++)
- supportedstats |= qemuDomainGetStatsWorkers[i].stats;
+ for (i = 0; qemuDomainGetStatsWorkers[i].func; i++) {
+ bool supportedByQemu = true;
+ virQEMUCapsFlags *requiredCaps = qemuDomainGetStatsWorkers[i].requiredCaps;
+
+ while (requiredCaps && *requiredCaps != QEMU_CAPS_LAST) {
+ if (!virQEMUCapsGet(priv->qemuCaps, *requiredCaps)) {
+ supportedByQemu = false;
+ break;
+ }
+
+ requiredCaps++;
+ }
+
+ if (supportedByQemu) {
+ supportedstats |= qemuDomainGetStatsWorkers[i].stats;
+ }
+ }
if (*stats == 0) {
*stats = supportedstats;
if (enforce &&
*stats & ~supportedstats) {
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
- _("Stats types bits 0x%x are not supported by this daemon"),
+ _("Stats types bits 0x%x are not supported by this daemon or QEMU"),
*stats & ~supportedstats);
return -1;
}
int nstats = 0;
size_t i;
int ret = -1;
- unsigned int privflags = 0;
unsigned int domflags = 0;
unsigned int lflags = flags & (VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE |
VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT |
if (virConnectGetAllDomainStatsEnsureACL(conn) < 0)
return -1;
- if (qemuDomainGetStatsCheckSupport(&stats, enforce) < 0)
- return -1;
-
if (ndoms) {
if (virDomainObjListConvert(driver->domains, conn, doms, ndoms, &vms,
&nvms, virConnectGetAllDomainStatsCheckACL,
tmpstats = g_new0(virDomainStatsRecordPtr, nvms + 1);
- if (qemuDomainGetStatsNeedMonitor(stats))
- privflags |= QEMU_DOMAIN_STATS_HAVE_JOB;
-
for (i = 0; i < nvms; i++) {
virDomainStatsRecordPtr tmp = NULL;
+ unsigned int privflags = 0;
+ unsigned int requestedStats = stats;
+
domflags = 0;
vm = vms[i];
virObjectLock(vm);
+ if (qemuDomainGetStatsCheckSupport(&requestedStats, enforce, vm) < 0) {
+ virObjectUnlock(vm);
+ goto cleanup;
+ }
+
+ if (qemuDomainGetStatsNeedMonitor(requestedStats))
+ privflags |= QEMU_DOMAIN_STATS_HAVE_JOB;
+
if (HAVE_JOB(privflags)) {
int rv;
if (flags & VIR_CONNECT_GET_ALL_DOMAINS_STATS_BACKING)
domflags |= QEMU_DOMAIN_STATS_BACKING;
- if (qemuDomainGetStats(conn, vm, stats, &tmp, domflags) < 0) {
+ if (qemuDomainGetStats(conn, vm, requestedStats, &tmp, domflags) < 0) {
if (HAVE_JOB(domflags) && vm)
qemuDomainObjEndJob(driver, vm);