[PATCH 0/4] qemu: Use 'flat' mode for 'query-named-block-nodes' when possible

Peter Krempa (4): qemu: qemuBlockGetNamedNodeData: Remove pointless error path qemu: monitor: Store whether 'query-named-block-nodes' supports 'flat' parameter qemuMonitorJSONBlockStatsUpdateCapacityBlockdev: Use 'flat' mode of query-named-block-nodes qemuMonitorJSONQueryNamedBlockNodes: Drop 'flat' argument src/qemu/qemu_block.c | 11 +++-------- src/qemu/qemu_monitor.c | 11 +++++------ src/qemu/qemu_monitor.h | 3 +-- src/qemu/qemu_monitor_json.c | 12 +++++------- src/qemu/qemu_monitor_json.h | 3 +-- src/qemu/qemu_monitor_priv.h | 2 ++ 6 files changed, 17 insertions(+), 25 deletions(-) -- 2.37.3

We don't need automatic freeing for 'blockNamedNodeData' and we can directly return it rather than checking it for NULL-ness first. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_block.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index b82e3311e1..e98b5d4739 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -2610,7 +2610,7 @@ qemuBlockGetNamedNodeData(virDomainObj *vm, virDomainAsyncJob asyncJob) { qemuDomainObjPrivate *priv = vm->privateData; - g_autoptr(GHashTable) blockNamedNodeData = NULL; + GHashTable *blockNamedNodeData = NULL; bool supports_flat = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_QMP_QUERY_NAMED_BLOCK_NODES_FLAT); @@ -2621,10 +2621,7 @@ qemuBlockGetNamedNodeData(virDomainObj *vm, qemuDomainObjExitMonitor(vm); - if (!blockNamedNodeData) - return NULL; - - return g_steal_pointer(&blockNamedNodeData); + return blockNamedNodeData; } -- 2.37.3

Rather than having callers always pass this flag store it in the qemuMonitor object. Following patches will convert the code to use this internal flag. In the future this will also simplify removal when all supported qemu versions will support the new mode. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor.c | 4 +++- src/qemu/qemu_monitor_priv.h | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index d09c561e47..dd394cd19b 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -622,8 +622,10 @@ qemuMonitorOpenInternal(virDomainObj *vm, mon->waitGreeting = true; mon->cb = cb; - if (priv) + if (priv) { mon->objectAddNoWrap = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_JSON); + mon->queryNamedBlockNodesFlat = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_QMP_QUERY_NAMED_BLOCK_NODES_FLAT); + } if (virSetCloseExec(mon->fd) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, diff --git a/src/qemu/qemu_monitor_priv.h b/src/qemu/qemu_monitor_priv.h index 2f7c662cef..0826a1da94 100644 --- a/src/qemu/qemu_monitor_priv.h +++ b/src/qemu/qemu_monitor_priv.h @@ -90,6 +90,8 @@ struct _qemuMonitor { /* true if qemu no longer wants 'props' sub-object of object-add */ bool objectAddNoWrap; + /* query-named-block-nodes supports the 'flat' option */ + bool queryNamedBlockNodesFlat; }; -- 2.37.3

'query-named-block-nodes' in non-flat mode returns redundantly nested data under the 'backing-image' field. Fortunately we don't need it when updating the capacity stats. This function was unfortunately not fixed originally when the support for flat mode was added. Use the flat cached in the monitor object to force flat mode if available. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_monitor_json.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 8a3421a6fc..0e34cb55ad 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2503,7 +2503,7 @@ qemuMonitorJSONBlockStatsUpdateCapacityBlockdev(qemuMonitor *mon, { g_autoptr(virJSONValue) nodes = NULL; - if (!(nodes = qemuMonitorJSONQueryNamedBlockNodes(mon, false))) + if (!(nodes = qemuMonitorJSONQueryNamedBlockNodes(mon, mon->queryNamedBlockNodesFlat))) return -1; if (virJSONValueArrayForeachSteal(nodes, -- 2.37.3

All callers pass the equivalent of looking up whether qemu supports QEMU_CAPS_QMP_QUERY_NAMED_BLOCK_NODES_FLAT. Use 'mon->queryNamedBlockNodesFlat' directly and refactor all callers. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_block.c | 4 +--- src/qemu/qemu_monitor.c | 7 ++----- src/qemu/qemu_monitor.h | 3 +-- src/qemu/qemu_monitor_json.c | 12 +++++------- src/qemu/qemu_monitor_json.h | 3 +-- 5 files changed, 10 insertions(+), 19 deletions(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index e98b5d4739..8a6f601b29 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -2611,13 +2611,11 @@ qemuBlockGetNamedNodeData(virDomainObj *vm, { qemuDomainObjPrivate *priv = vm->privateData; GHashTable *blockNamedNodeData = NULL; - bool supports_flat = virQEMUCapsGet(priv->qemuCaps, - QEMU_CAPS_QMP_QUERY_NAMED_BLOCK_NODES_FLAT); if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) return NULL; - blockNamedNodeData = qemuMonitorBlockGetNamedNodeData(priv->mon, supports_flat); + blockNamedNodeData = qemuMonitorBlockGetNamedNodeData(priv->mon); qemuDomainObjExitMonitor(vm); diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index dd394cd19b..cd9f43071e 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1990,20 +1990,17 @@ qemuMonitorBlockStatsUpdateCapacityBlockdev(qemuMonitor *mon, /** * qemuMonitorBlockGetNamedNodeData: * @mon: monitor object - * @supports_flat: don't query data for backing store * * Uses 'query-named-block-nodes' to retrieve information about individual * storage nodes and returns them in a hash table of qemuBlockNamedNodeData *s * filled with the data. The hash table keys are node names. */ GHashTable * -qemuMonitorBlockGetNamedNodeData(qemuMonitor *mon, - bool supports_flat) +qemuMonitorBlockGetNamedNodeData(qemuMonitor *mon) { QEMU_CHECK_MONITOR_NULL(mon); - VIR_DEBUG("supports_flat=%d", supports_flat); - return qemuMonitorJSONBlockGetNamedNodeData(mon, supports_flat); + return qemuMonitorJSONBlockGetNamedNodeData(mon); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 5a84a4d095..62f1bc1299 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -712,8 +712,7 @@ struct _qemuBlockNamedNodeData { }; GHashTable * -qemuMonitorBlockGetNamedNodeData(qemuMonitor *mon, - bool supports_flat); +qemuMonitorBlockGetNamedNodeData(qemuMonitor *mon); int qemuMonitorBlockResize(qemuMonitor *mon, const char *device, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 0e34cb55ad..74967afb24 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2037,14 +2037,13 @@ qemuMonitorJSONSetDBusVMStateIdList(qemuMonitor *mon, * Returns: NULL on error, reply on success */ static virJSONValue * -qemuMonitorJSONQueryNamedBlockNodes(qemuMonitor *mon, - bool flat) +qemuMonitorJSONQueryNamedBlockNodes(qemuMonitor *mon) { g_autoptr(virJSONValue) cmd = NULL; g_autoptr(virJSONValue) reply = NULL; if (!(cmd = qemuMonitorJSONMakeCommand("query-named-block-nodes", - "B:flat", flat, + "B:flat", mon->queryNamedBlockNodesFlat, NULL))) return NULL; @@ -2503,7 +2502,7 @@ qemuMonitorJSONBlockStatsUpdateCapacityBlockdev(qemuMonitor *mon, { g_autoptr(virJSONValue) nodes = NULL; - if (!(nodes = qemuMonitorJSONQueryNamedBlockNodes(mon, mon->queryNamedBlockNodesFlat))) + if (!(nodes = qemuMonitorJSONQueryNamedBlockNodes(mon))) return -1; if (virJSONValueArrayForeachSteal(nodes, @@ -2669,12 +2668,11 @@ qemuMonitorJSONBlockGetNamedNodeDataJSON(virJSONValue *nodes) GHashTable * -qemuMonitorJSONBlockGetNamedNodeData(qemuMonitor *mon, - bool supports_flat) +qemuMonitorJSONBlockGetNamedNodeData(qemuMonitor *mon) { g_autoptr(virJSONValue) nodes = NULL; - if (!(nodes = qemuMonitorJSONQueryNamedBlockNodes(mon, supports_flat))) + if (!(nodes = qemuMonitorJSONQueryNamedBlockNodes(mon))) return NULL; return qemuMonitorJSONBlockGetNamedNodeDataJSON(nodes); diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index c0abc9dd4f..4c65838b7e 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -105,8 +105,7 @@ GHashTable * qemuMonitorJSONBlockGetNamedNodeDataJSON(virJSONValue *nodes); GHashTable * -qemuMonitorJSONBlockGetNamedNodeData(qemuMonitor *mon, - bool supports_flat); +qemuMonitorJSONBlockGetNamedNodeData(qemuMonitor *mon); int qemuMonitorJSONBlockResize(qemuMonitor *mon, -- 2.37.3

On a Wednesday in 2022, Peter Krempa wrote:
Peter Krempa (4): qemu: qemuBlockGetNamedNodeData: Remove pointless error path qemu: monitor: Store whether 'query-named-block-nodes' supports 'flat' parameter qemuMonitorJSONBlockStatsUpdateCapacityBlockdev: Use 'flat' mode of query-named-block-nodes qemuMonitorJSONQueryNamedBlockNodes: Drop 'flat' argument
src/qemu/qemu_block.c | 11 +++-------- src/qemu/qemu_monitor.c | 11 +++++------ src/qemu/qemu_monitor.h | 3 +-- src/qemu/qemu_monitor_json.c | 12 +++++------- src/qemu/qemu_monitor_json.h | 3 +-- src/qemu/qemu_monitor_priv.h | 2 ++ 6 files changed, 17 insertions(+), 25 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (2)
-
Ján Tomko
-
Peter Krempa