Prepare for the upcoming refactor to use qemuFDPass for all the network
related file descriptors:
- tapfds
- vhostfds
- slirp
- vdpa
This patch adds the private data variables and a utility function to
clear it. Clearing is useful since we don't really need the data once
the VM is running so we save some memory.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_command.c | 3 +++
src/qemu/qemu_domain.c | 15 +++++++++++++++
src/qemu/qemu_domain.h | 8 ++++++++
src/qemu/qemu_hotplug.c | 3 +++
4 files changed, 29 insertions(+)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 95632827cb..0d1517a5d6 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -8682,6 +8682,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
qemuSlirp *slirp;
size_t i;
g_autoptr(virJSONValue) hostnetprops = NULL;
+ qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
if (qemuDomainValidateActualNetDef(net, qemuCaps) < 0)
return -1;
@@ -8938,6 +8939,8 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
ret = 0;
cleanup:
+ qemuDomainNetworkPrivateClearFDs(netpriv);
+
if (ret < 0) {
virErrorPtr saved_err;
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 2df02943bf..96b0fe56ee 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1045,12 +1045,27 @@ qemuDomainNetworkPrivateNew(void)
}
+void
+qemuDomainNetworkPrivateClearFDs(qemuDomainNetworkPrivate *priv)
+{
+ if (!priv)
+ return;
+
+ g_clear_pointer(&priv->slirpfd, qemuFDPassFree);
+ g_clear_pointer(&priv->vdpafd, qemuFDPassFree);
+ g_slist_free_full(g_steal_pointer(&priv->vhostfds), (GDestroyNotify)
qemuFDPassFree);
+ g_slist_free_full(g_steal_pointer(&priv->tapfds), (GDestroyNotify)
qemuFDPassFree);
+}
+
+
static void
qemuDomainNetworkPrivateDispose(void *obj G_GNUC_UNUSED)
{
qemuDomainNetworkPrivate *priv = obj;
qemuSlirpFree(priv->slirp);
+
+ qemuDomainNetworkPrivateClearFDs(priv);
}
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index e13c6be399..85f75ee197 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -398,8 +398,16 @@ struct _qemuDomainNetworkPrivate {
virObject parent;
qemuSlirp *slirp;
+
+ /* file descriptor transfer helpers */
+ qemuFDPass *slirpfd;
+ GSList *tapfds;
+ GSList *vhostfds;
+ qemuFDPass *vdpafd;
};
+void
+qemuDomainNetworkPrivateClearFDs(qemuDomainNetworkPrivate *priv);
typedef enum {
QEMU_PROCESS_EVENT_WATCHDOG = 0,
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index e8e028706b..2923992759 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1181,6 +1181,7 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
{
qemuDomainObjPrivate *priv = vm->privateData;
virDomainDeviceDef dev = { VIR_DOMAIN_DEVICE_NET, { .net = net } };
+ qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
virErrorPtr originalError = NULL;
g_autofree char *slirpfdName = NULL;
int slirpfd = -1;
@@ -1541,6 +1542,8 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
ret = 0;
cleanup:
+ qemuDomainNetworkPrivateClearFDs(netpriv);
+
if (ret < 0) {
virErrorPreserveLast(&save_err);
if (releaseaddr)
--
2.35.1