From 278c630d2a3dd0c311f5f52818ca061cb58818cc Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 5 May 2022 15:45:55 +0200 Subject: [PATCH] qemu: domain: Store and update 'fdsetindex' across libvirtd restarts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While 'add-fd' qmp command gives the possibility to find an unused fdset ID when hot-adding fdsets, such usage is extremely inconvenient. This patch allows us to track the used fdset id so that we can avoid the need to check results and thus employ simpler code flow when hot-adding devices which use FD passing. Signed-off-by: Peter Krempa Reviewed-by: Jonathon Jongsma Reviewed-by: Ján Tomko --- src/qemu/qemu_domain.c | 5 +++ src/qemu/qemu_domain.h | 3 +- src/qemu/qemu_process.c | 31 +++++++++++++++++++ .../qemustatusxml2xmldata/backup-pull-in.xml | 1 + .../blockjob-blockdev-in.xml | 1 + .../blockjob-mirror-in.xml | 1 + .../migration-in-params-in.xml | 1 + .../migration-out-nbd-bitmaps-in.xml | 1 + .../migration-out-nbd-out.xml | 1 + .../migration-out-nbd-tls-out.xml | 1 + .../migration-out-params-in.xml | 1 + tests/qemustatusxml2xmldata/modern-in.xml | 1 + tests/qemustatusxml2xmldata/upgrade-out.xml | 1 + .../qemustatusxml2xmldata/vcpus-multi-in.xml | 1 + 14 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 4d4be0683a..9d090204fe 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2372,6 +2372,8 @@ qemuDomainObjPrivateXMLFormat(virBuffer *buf, if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) virBufferAsprintf(buf, "\n", priv->nodenameindex); + virBufferAsprintf(buf, "\n", priv->fdsetindex); + if (priv->memPrealloc) virBufferAddLit(buf, "\n"); @@ -3106,6 +3108,9 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, return -1; } + if (virXPathUInt("string(./fdset/@index)", ctxt, &priv->fdsetindex) == 0) + priv->fdsetindexParsed = true; + priv->memPrealloc = virXPathBoolean("boolean(./memPrealloc)", ctxt) == 1; if (virXPathULongLong("string(./originalMemlock)", diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 248af92649..3d1447178c 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -204,8 +204,9 @@ struct _qemuDomainObjPrivate { /* counter for generating node names for qemu disks */ unsigned long long nodenameindex; - /* counter for generating IDs of fdsets - only relevant during startup */ + /* counter for generating IDs of fdsets */ unsigned int fdsetindex; + bool fdsetindexParsed; /* qemuProcessStartCPUs stores the reason for starting vCPUs here for the * RESUME event handler to use it */ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 3128d6cac0..a023e6eb4c 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -2265,6 +2265,34 @@ qemuRefreshPRManagerState(virQEMUDriver *driver, } +static int +qemuProcessRefreshFdsetIndex(virDomainObj *vm) +{ + qemuDomainObjPrivate *priv = vm->privateData; + g_autoptr(qemuMonitorFdsets) fdsets = NULL; + size_t i; + int rc; + + /* if the previous index was in the status XML we don't need to update it */ + if (priv->fdsetindexParsed) + return 0; + + qemuDomainObjEnterMonitor(priv->driver, vm); + rc = qemuMonitorQueryFdsets(priv->mon, &fdsets); + qemuDomainObjExitMonitor(vm); + + if (rc < 0) + return -1; + + for (i = 0; i < fdsets->nfdsets; i++) { + if (fdsets->fdsets[i].id >= priv->fdsetindex) + priv->fdsetindex = fdsets->fdsets[i].id + 1; + } + + return 0; +} + + static void qemuRefreshRTC(virQEMUDriver *driver, virDomainObj *vm) @@ -8928,6 +8956,9 @@ qemuProcessReconnect(void *opaque) if (qemuRefreshPRManagerState(driver, obj) < 0) goto error; + if (qemuProcessRefreshFdsetIndex(obj) < 0) + goto error; + qemuProcessReconnectCheckMemAliasOrderMismatch(obj); if (qemuConnectAgent(driver, obj) < 0) diff --git a/tests/qemustatusxml2xmldata/backup-pull-in.xml b/tests/qemustatusxml2xmldata/backup-pull-in.xml index 59c934d4f7..e7fdc6c478 100644 --- a/tests/qemustatusxml2xmldata/backup-pull-in.xml +++ b/tests/qemustatusxml2xmldata/backup-pull-in.xml @@ -234,6 +234,7 @@ + diff --git a/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml b/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml index 52024f242c..b62b3149c2 100644 --- a/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml +++ b/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml @@ -233,6 +233,7 @@ + diff --git a/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml b/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml index 00c8e69adc..73fe437f87 100644 --- a/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml +++ b/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml @@ -22,6 +22,7 @@ + -2 diff --git a/tests/qemustatusxml2xmldata/migration-in-params-in.xml b/tests/qemustatusxml2xmldata/migration-in-params-in.xml index f4bc5753c4..8b0878c82e 100644 --- a/tests/qemustatusxml2xmldata/migration-in-params-in.xml +++ b/tests/qemustatusxml2xmldata/migration-in-params-in.xml @@ -256,6 +256,7 @@ + -2 diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml index c88996f923..7d55db0996 100644 --- a/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml +++ b/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml @@ -343,6 +343,7 @@ + diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml index 039dcacc58..1a918c0b5a 100644 --- a/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml +++ b/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml @@ -259,6 +259,7 @@ + -2 diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml index 3d1ddd5771..87c67f8300 100644 --- a/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml +++ b/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml @@ -288,6 +288,7 @@ + -2 diff --git a/tests/qemustatusxml2xmldata/migration-out-params-in.xml b/tests/qemustatusxml2xmldata/migration-out-params-in.xml index cd9dbccd3a..73ac09fb92 100644 --- a/tests/qemustatusxml2xmldata/migration-out-params-in.xml +++ b/tests/qemustatusxml2xmldata/migration-out-params-in.xml @@ -270,6 +270,7 @@ + -2 diff --git a/tests/qemustatusxml2xmldata/modern-in.xml b/tests/qemustatusxml2xmldata/modern-in.xml index cc5fd1cb74..7759034f7a 100644 --- a/tests/qemustatusxml2xmldata/modern-in.xml +++ b/tests/qemustatusxml2xmldata/modern-in.xml @@ -261,6 +261,7 @@ + -2 diff --git a/tests/qemustatusxml2xmldata/upgrade-out.xml b/tests/qemustatusxml2xmldata/upgrade-out.xml index 5218092cb9..ac2ffeddc2 100644 --- a/tests/qemustatusxml2xmldata/upgrade-out.xml +++ b/tests/qemustatusxml2xmldata/upgrade-out.xml @@ -258,6 +258,7 @@ + -2 diff --git a/tests/qemustatusxml2xmldata/vcpus-multi-in.xml b/tests/qemustatusxml2xmldata/vcpus-multi-in.xml index 7f0208453f..0b8bc37c15 100644 --- a/tests/qemustatusxml2xmldata/vcpus-multi-in.xml +++ b/tests/qemustatusxml2xmldata/vcpus-multi-in.xml @@ -308,6 +308,7 @@ + -2