[PATCH 18/37] qemu: Prepare netdev code for use of qemuFDPass for tapfd/vhostfd passing

Peter Krempa pkrempa at redhat.com
Tue May 10 15:19:54 UTC 2022


Add alternative code paths for passing of the FDs using the new
infrastructure. This way we'll be able to refactor the code
incrementally.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_command.c | 45 ++++++++++++++++++++++++++++++++++++-----
 src/qemu/qemu_hotplug.c | 22 ++++++++++++++++++++
 2 files changed, 62 insertions(+), 5 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index c412bc50e0..fc8e209976 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4223,17 +4223,41 @@ qemuBuildHostNetProps(virDomainNetDef *net,
         const char *vhostfd_field = "S:vhostfd";
         g_autofree char *vhostfd_arg = NULL;
         bool vhost = false;
+        size_t nfds;
+        GSList *n;
+
+        if (netpriv->tapfds) {
+            nfds = 0;
+            for (n = netpriv->tapfds; n; n = n->next) {
+                virBufferAsprintf(&buf, "%s:", qemuFDPassGetPath(n->data));
+                nfds++;
+            }

-        for (i = 0; i < tapfdSize; i++)
-            virBufferAsprintf(&buf, "%s:", tapfd[i]);
+            if (nfds > 1)
+                tapfd_field = "s:fds";
+        } else {
+            for (i = 0; i < tapfdSize; i++)
+                virBufferAsprintf(&buf, "%s:", tapfd[i]);

-        if (tapfdSize > 1)
-            tapfd_field = "s:fds";
+            if (tapfdSize > 1)
+                tapfd_field = "s:fds";
+        }

         virBufferTrim(&buf, ":");
         tapfd_arg = virBufferContentAndReset(&buf);

-        if (vhostfdSize > 0) {
+        if (netpriv->vhostfds) {
+            vhost = true;
+
+            nfds = 0;
+            for (n = netpriv->vhostfds; n; n = n->next) {
+                virBufferAsprintf(&buf, "%s:", qemuFDPassGetPath(n->data));
+                nfds++;
+            }
+
+            if (nfds > 1)
+                vhostfd_field = "s:vhostfds";
+        } else if (vhostfdSize > 0) {
             vhost = true;

             for (i = 0; i < vhostfdSize; i++)
@@ -8722,6 +8746,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
     size_t i;
     g_autoptr(virJSONValue) hostnetprops = NULL;
     qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
+    GSList *n;

     if (qemuDomainValidateActualNetDef(net, qemuCaps) < 0)
         return -1;
@@ -8930,6 +8955,16 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
         vhostfd[i] = -1;
     }

+    for (n = netpriv->tapfds; n; n = n->next) {
+        if (qemuFDPassTransferCommand(n->data, cmd) < 0)
+            return -1;
+    }
+
+    for (n = netpriv->vhostfds; n; n = n->next) {
+        if (qemuFDPassTransferCommand(n->data, cmd) < 0)
+            return -1;
+    }
+
     if (qemuFDPassTransferCommand(netpriv->vdpafd, cmd) < 0)
         return -1;

diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 525c55baf2..28868cf3d0 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1210,6 +1210,7 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
     g_autoptr(virConnect) conn = NULL;
     virErrorPtr save_err = NULL;
     bool teardownlabel = false;
+    GSList *n;

     /* If appropriate, grab a physical device from the configured
      * network's pool of devices, or resolve bridge device name
@@ -1460,6 +1461,20 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,

     qemuDomainObjEnterMonitor(driver, vm);

+    for (n = netpriv->tapfds; n; n = n->next) {
+        if (qemuFDPassTransferMonitor(n->data, priv->mon) < 0) {
+            qemuDomainObjExitMonitor(vm);
+            goto cleanup;
+        }
+    }
+
+    for (n = netpriv->vhostfds; n; n = n->next) {
+        if (qemuFDPassTransferMonitor(n->data, priv->mon) < 0) {
+            qemuDomainObjExitMonitor(vm);
+            goto cleanup;
+        }
+    }
+
     if (qemuFDPassTransferMonitor(netpriv->vdpafd, priv->mon) < 0) {
         qemuDomainObjExitMonitor(vm);
         goto cleanup;
@@ -1619,6 +1634,13 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
         qemuMonitorRemoveNetdev(priv->mon, netdev_name) < 0)
         VIR_WARN("Failed to remove network backend for netdev %s",
                  netdev_name);
+
+    for (n = netpriv->tapfds; n; n = n->next)
+        qemuFDPassTransferMonitorRollback(n->data, priv->mon);
+
+    for (n = netpriv->vhostfds; n; n = n->next)
+        qemuFDPassTransferMonitorRollback(n->data, priv->mon);
+
     qemuDomainObjExitMonitor(vm);
     virErrorRestore(&originalError);
     goto cleanup;
-- 
2.35.1



More information about the libvir-list mailing list