[PATCH 0/3] qemu: Simplify qemuDomainGetStats() related code

*** BLURB HERE *** Michal Prívozník (3): qemu: Drop comma after QEMU_CAPS_LAST in queryDirtyRateRequired[] qemu: prefer .requiredCaps for VIR_DOMAIN_STATS_IOTHREAD qemuConnectGetAllDomainStats: Simplify qemuDomainGetStats() error handling src/qemu/qemu_driver.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) -- 2.32.0

The idea of queryDirtyRateRequired[] is that it lists QEMU capabilities required for given domstats record (VIR_DOMAIN_STATS_DIRTYRATE in this particular case) and QEMU_CAPS_LAST is used as a sentinel. Therefore, there can never be anything after it. Drop the comma to make it more obvious. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b88fb47032..d3430557f0 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18667,7 +18667,7 @@ struct qemuDomainGetStatsWorker { static virQEMUCapsFlags queryDirtyRateRequired[] = { QEMU_CAPS_QUERY_DIRTY_RATE, - QEMU_CAPS_LAST, + QEMU_CAPS_LAST }; static struct qemuDomainGetStatsWorker qemuDomainGetStatsWorkers[] = { -- 2.32.0

Since f29d7c3e698 we have an option for checking capabilities required for given type of statistics upfront, instead of the callback. Switch qemuDomainGetStatsIOThread() callback to the new style. This will now error out properly if user requests IOTHREAD stats forcibly (via VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS flag) but QEMU doesn't support IOThreads. Previously, this was silently ignored. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_driver.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d3430557f0..f12a5aef11 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18513,7 +18513,6 @@ qemuDomainGetStatsIOThread(virQEMUDriver *driver, virTypedParamList *params, unsigned int privflags) { - qemuDomainObjPrivate *priv = dom->privateData; size_t i; qemuMonitorIOThreadInfo **iothreads = NULL; int niothreads = 0; @@ -18522,9 +18521,6 @@ qemuDomainGetStatsIOThread(virQEMUDriver *driver, if (!HAVE_JOB(privflags) || !virDomainObjIsActive(dom)) return 0; - if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_IOTHREAD)) - return 0; - if (qemuDomainGetIOThreadsMon(driver, dom, &iothreads, &niothreads) < 0) return -1; @@ -18665,6 +18661,12 @@ struct qemuDomainGetStatsWorker { virQEMUCapsFlags *requiredCaps; }; + +static virQEMUCapsFlags queryIOThreadRequired[] = { + QEMU_CAPS_OBJECT_IOTHREAD, + QEMU_CAPS_LAST +}; + static virQEMUCapsFlags queryDirtyRateRequired[] = { QEMU_CAPS_QUERY_DIRTY_RATE, QEMU_CAPS_LAST @@ -18678,7 +18680,7 @@ static struct qemuDomainGetStatsWorker qemuDomainGetStatsWorkers[] = { { qemuDomainGetStatsInterface, VIR_DOMAIN_STATS_INTERFACE, false, NULL }, { qemuDomainGetStatsBlock, VIR_DOMAIN_STATS_BLOCK, true, NULL }, { qemuDomainGetStatsPerf, VIR_DOMAIN_STATS_PERF, false, NULL }, - { qemuDomainGetStatsIOThread, VIR_DOMAIN_STATS_IOTHREAD, true, NULL }, + { qemuDomainGetStatsIOThread, VIR_DOMAIN_STATS_IOTHREAD, true, queryIOThreadRequired }, { qemuDomainGetStatsMemory, VIR_DOMAIN_STATS_MEMORY, false, NULL }, { qemuDomainGetStatsDirtyRate, VIR_DOMAIN_STATS_DIRTYRATE, true, queryDirtyRateRequired }, { NULL, 0, false, NULL } -- 2.32.0

In qemuConnectGetAllDomainStats() there a loop that iterates over all domains that stats are to be fetched for. Within this loop the qemuDomainGetStats() is called which is responsible for fetching stats for an individual domain. Now, the code that handles successful and failure cases is almost the same. Rework it, so that the code is deduplicated. Note, that the check for !tmp is dropped because upon successful return from qemuDomainGetStats() it is always allocated. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_driver.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index f12a5aef11..6333d0af36 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18830,6 +18830,10 @@ qemuConnectGetAllDomainStats(virConnectPtr conn, unsigned int privflags = 0; unsigned int requestedStats = stats; unsigned int domflags = 0; + int rc; + + if (flags & VIR_CONNECT_GET_ALL_DOMAINS_STATS_BACKING) + domflags |= QEMU_DOMAIN_STATS_BACKING; virObjectLock(vm); @@ -18854,23 +18858,17 @@ qemuConnectGetAllDomainStats(virConnectPtr conn, } /* else: without a job it's still possible to gather some data */ - if (flags & VIR_CONNECT_GET_ALL_DOMAINS_STATS_BACKING) - domflags |= QEMU_DOMAIN_STATS_BACKING; - if (qemuDomainGetStats(conn, vm, requestedStats, &tmp, domflags) < 0) { - if (HAVE_JOB(domflags) && vm) - qemuDomainObjEndJob(driver, vm); - - virObjectUnlock(vm); - goto cleanup; - } - - if (tmp) - tmpstats[nstats++] = tmp; + rc = qemuDomainGetStats(conn, vm, requestedStats, &tmp, domflags); if (HAVE_JOB(domflags)) qemuDomainObjEndJob(driver, vm); virObjectUnlock(vm); + + if (rc < 0) + goto cleanup; + + tmpstats[nstats++] = tmp; } *retStats = g_steal_pointer(&tmpstats); -- 2.32.0

On a Thursday in 2021, Michal Privoznik wrote:
*** BLURB HERE ***
Michal Prívozník (3): qemu: Drop comma after QEMU_CAPS_LAST in queryDirtyRateRequired[] qemu: prefer .requiredCaps for VIR_DOMAIN_STATS_IOTHREAD qemuConnectGetAllDomainStats: Simplify qemuDomainGetStats() error handling
src/qemu/qemu_driver.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (2)
-
Ján Tomko
-
Michal Privoznik