]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: domain: Add qemuFDPass helpers into network private data
authorPeter Krempa <pkrempa@redhat.com>
Mon, 9 May 2022 07:50:51 +0000 (09:50 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 16 May 2022 07:15:45 +0000 (09:15 +0200)
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@redhat.com>
Reviewed-by: Jonathon Jongsma <jjongsma@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_command.c
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_hotplug.c

index 5ee3874e53453879fff4d8bd3baf34b863566e29..99f753c2f864effa3aef6acd2aadda7f37439b31 100644 (file)
@@ -8704,6 +8704,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;
@@ -8960,6 +8961,8 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
 
     ret = 0;
  cleanup:
+    qemuDomainNetworkPrivateClearFDs(netpriv);
+
     if (ret < 0) {
         virErrorPtr saved_err;
 
index b960cd17309e67b6708207e18209de671f2741fa..4305d5db0682929a4eb3f352f8d6989b1ffd102b 100644 (file)
@@ -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);
 }
 
 
index edbcc1aed2a09918ad42d82fb7e5aecc37562789..e9eda8903ec2f1e382880608e88d6e874f143237 100644 (file)
@@ -401,8 +401,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,
index e8e028706bd76198e4a0e412fc521d3c77e0f4bd..2923992759654ee5c8074b7d0e5f0248c116876a 100644 (file)
@@ -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)