[libvirt] [PATCH 10/12] qemu-command: Move and rename qemuOpenVhostNet

John Ferlan jferlan at redhat.com
Mon Feb 15 19:37:24 UTC 2016


Move function to qemu_interface.c and rename to qemuInterfaceOpenVhostNet

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/qemu/qemu_command.c   | 97 +----------------------------------------------
 src/qemu/qemu_command.h   |  6 ---
 src/qemu/qemu_hotplug.c   |  9 +++--
 src/qemu/qemu_interface.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++
 src/qemu/qemu_interface.h |  7 ++++
 5 files changed, 112 insertions(+), 104 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index a37dba6..60dac2f 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -257,100 +257,6 @@ qemuBuildObjectCommandlineFromJSON(const char *type,
 }
 
 
-/**
- * qemuOpenVhostNet:
- * @def: domain definition
- * @net: network definition
- * @qemuCaps: qemu binary capabilities
- * @vhostfd: array of opened vhost-net device
- * @vhostfdSize: number of file descriptors in @vhostfd array
- *
- * Open vhost-net, multiple times - if requested.
- * In case, no vhost-net is needed, @vhostfdSize is set to 0
- * and 0 is returned.
- *
- * Returns: 0 on success
- *         -1 on failure
- */
-int
-qemuOpenVhostNet(virDomainDefPtr def,
-                 virDomainNetDefPtr net,
-                 virQEMUCapsPtr qemuCaps,
-                 int *vhostfd,
-                 size_t *vhostfdSize)
-{
-    size_t i;
-    const char *vhostnet_path = net->backend.vhost;
-
-    if (!vhostnet_path)
-        vhostnet_path = "/dev/vhost-net";
-
-    /* If running a plain QEMU guest, or
-     * if the config says explicitly to not use vhost, return now*/
-    if (def->virtType != VIR_DOMAIN_VIRT_KVM ||
-        net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_QEMU) {
-        *vhostfdSize = 0;
-        return 0;
-    }
-
-    /* If qemu doesn't support vhost-net mode (including the -netdev command
-     * option), don't try to open the device.
-     */
-    if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOST_NET) &&
-          qemuDomainSupportsNetdev(def, qemuCaps, net))) {
-        if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           "%s", _("vhost-net is not supported with "
-                                   "this QEMU binary"));
-            return -1;
-        }
-        *vhostfdSize = 0;
-        return 0;
-    }
-
-    /* If the nic model isn't virtio, don't try to open. */
-    if (!(net->model && STREQ(net->model, "virtio"))) {
-        if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                           "%s", _("vhost-net is only supported for "
-                                   "virtio network interfaces"));
-            return -1;
-        }
-        *vhostfdSize = 0;
-        return 0;
-    }
-
-    for (i = 0; i < *vhostfdSize; i++) {
-        vhostfd[i] = open(vhostnet_path, O_RDWR);
-
-        /* If the config says explicitly to use vhost and we couldn't open it,
-         * report an error.
-         */
-        if (vhostfd[i] < 0) {
-            virDomainAuditNetDevice(def, net, vhostnet_path, false);
-            if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                               "%s", _("vhost-net was requested for an interface, "
-                                       "but is unavailable"));
-                goto error;
-            }
-            VIR_WARN("Unable to open vhost-net. Opened so far %zu, requested %zu",
-                     i, *vhostfdSize);
-            *vhostfdSize = i;
-            break;
-        }
-    }
-    virDomainAuditNetDevice(def, net, vhostnet_path, *vhostfdSize);
-    return 0;
-
- error:
-    while (i--)
-        VIR_FORCE_CLOSE(vhostfd[i]);
-
-    return -1;
-}
-
-
 int
 qemuNetworkPrepareDevices(virDomainDefPtr def)
 {
@@ -6672,7 +6578,8 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
 
         memset(vhostfd, -1, vhostfdSize * sizeof(vhostfd[0]));
 
-        if (qemuOpenVhostNet(def, net, qemuCaps, vhostfd, &vhostfdSize) < 0)
+        if (qemuInterfaceOpenVhostNet(def, net, qemuCaps,
+                                      vhostfd, &vhostfdSize) < 0)
             goto cleanup;
     }
 
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
index 7ed0ad5..61a0212 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -224,12 +224,6 @@ char *qemuBuildRedirdevDevStr(virDomainDefPtr def,
                               virDomainRedirdevDefPtr dev,
                               virQEMUCapsPtr qemuCaps);
 
-int qemuOpenVhostNet(virDomainDefPtr def,
-                     virDomainNetDefPtr net,
-                     virQEMUCapsPtr qemuCaps,
-                     int *vhostfd,
-                     size_t *vhostfdSize);
-
 int qemuNetworkPrepareDevices(virDomainDefPtr def);
 
 int qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps);
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index e635fab..71cfc79 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -926,7 +926,8 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
                                         tapfd, &tapfdSize) < 0)
             goto cleanup;
         iface_connected = true;
-        if (qemuOpenVhostNet(vm->def, net, priv->qemuCaps, vhostfd, &vhostfdSize) < 0)
+        if (qemuInterfaceOpenVhostNet(vm->def, net, priv->qemuCaps,
+                                      vhostfd, &vhostfdSize) < 0)
             goto cleanup;
     } else if (actualType == VIR_DOMAIN_NET_TYPE_DIRECT) {
         tapfdSize = vhostfdSize = net->driver.virtio.queues;
@@ -943,14 +944,16 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
                                          VIR_NETDEV_VPORT_PROFILE_OP_CREATE) < 0)
             goto cleanup;
         iface_connected = true;
-        if (qemuOpenVhostNet(vm->def, net, priv->qemuCaps, vhostfd, &vhostfdSize) < 0)
+        if (qemuInterfaceOpenVhostNet(vm->def, net, priv->qemuCaps,
+                                      vhostfd, &vhostfdSize) < 0)
             goto cleanup;
     } else if (actualType == VIR_DOMAIN_NET_TYPE_ETHERNET) {
         vhostfdSize = 1;
         if (VIR_ALLOC(vhostfd) < 0)
             goto cleanup;
         *vhostfd = -1;
-        if (qemuOpenVhostNet(vm->def, net, priv->qemuCaps, vhostfd, &vhostfdSize) < 0)
+        if (qemuInterfaceOpenVhostNet(vm->def, net, priv->qemuCaps,
+                                      vhostfd, &vhostfdSize) < 0)
             goto cleanup;
     }
 
diff --git a/src/qemu/qemu_interface.c b/src/qemu/qemu_interface.c
index 2584236..79507af 100644
--- a/src/qemu/qemu_interface.c
+++ b/src/qemu/qemu_interface.c
@@ -38,6 +38,9 @@
 #include "virnetdevbridge.h"
 #include "virnetdevvportprofile.h"
 
+#include <sys/stat.h>
+#include <fcntl.h>
+
 #define VIR_FROM_THIS VIR_FROM_QEMU
 
 VIR_LOG_INIT("qemu.qemu_interface");
@@ -500,3 +503,97 @@ qemuInterfaceNetworkConnect(virDomainDefPtr def,
 
     return ret;
 }
+
+
+/**
+ * qemuInterfaceOpenVhostNet:
+ * @def: domain definition
+ * @net: network definition
+ * @qemuCaps: qemu binary capabilities
+ * @vhostfd: array of opened vhost-net device
+ * @vhostfdSize: number of file descriptors in @vhostfd array
+ *
+ * Open vhost-net, multiple times - if requested.
+ * In case, no vhost-net is needed, @vhostfdSize is set to 0
+ * and 0 is returned.
+ *
+ * Returns: 0 on success
+ *         -1 on failure
+ */
+int
+qemuInterfaceOpenVhostNet(virDomainDefPtr def,
+                          virDomainNetDefPtr net,
+                          virQEMUCapsPtr qemuCaps,
+                          int *vhostfd,
+                          size_t *vhostfdSize)
+{
+    size_t i;
+    const char *vhostnet_path = net->backend.vhost;
+
+    if (!vhostnet_path)
+        vhostnet_path = "/dev/vhost-net";
+
+    /* If running a plain QEMU guest, or
+     * if the config says explicitly to not use vhost, return now*/
+    if (def->virtType != VIR_DOMAIN_VIRT_KVM ||
+        net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_QEMU) {
+        *vhostfdSize = 0;
+        return 0;
+    }
+
+    /* If qemu doesn't support vhost-net mode (including the -netdev command
+     * option), don't try to open the device.
+     */
+    if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOST_NET) &&
+          qemuDomainSupportsNetdev(def, qemuCaps, net))) {
+        if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           "%s", _("vhost-net is not supported with "
+                                   "this QEMU binary"));
+            return -1;
+        }
+        *vhostfdSize = 0;
+        return 0;
+    }
+
+    /* If the nic model isn't virtio, don't try to open. */
+    if (!(net->model && STREQ(net->model, "virtio"))) {
+        if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           "%s", _("vhost-net is only supported for "
+                                   "virtio network interfaces"));
+            return -1;
+        }
+        *vhostfdSize = 0;
+        return 0;
+    }
+
+    for (i = 0; i < *vhostfdSize; i++) {
+        vhostfd[i] = open(vhostnet_path, O_RDWR);
+
+        /* If the config says explicitly to use vhost and we couldn't open it,
+         * report an error.
+         */
+        if (vhostfd[i] < 0) {
+            virDomainAuditNetDevice(def, net, vhostnet_path, false);
+            if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                               "%s", _("vhost-net was requested for an interface, "
+                                       "but is unavailable"));
+                goto error;
+            }
+            VIR_WARN("Unable to open vhost-net. Opened so far %zu, requested %zu",
+                     i, *vhostfdSize);
+            *vhostfdSize = i;
+            break;
+        }
+    }
+    virDomainAuditNetDevice(def, net, vhostnet_path, *vhostfdSize);
+    return 0;
+
+ error:
+    while (i--)
+        VIR_FORCE_CLOSE(vhostfd[i]);
+
+    return -1;
+}
diff --git a/src/qemu/qemu_interface.h b/src/qemu/qemu_interface.h
index 9cc7331..8207e9f 100644
--- a/src/qemu/qemu_interface.h
+++ b/src/qemu/qemu_interface.h
@@ -27,6 +27,7 @@
 
 # include "domain_conf.h"
 # include "qemu_conf.h"
+# include "qemu_domain.h"
 
 int qemuInterfaceStartDevice(virDomainNetDefPtr net);
 int qemuInterfaceStartDevices(virDomainDefPtr def);
@@ -46,4 +47,10 @@ int qemuInterfaceNetworkConnect(virDomainDefPtr def,
                                 int *tapfd,
                                 size_t *tapfdSize)
     ATTRIBUTE_NONNULL(2);
+
+int qemuInterfaceOpenVhostNet(virDomainDefPtr def,
+                              virDomainNetDefPtr net,
+                              virQEMUCapsPtr qemuCaps,
+                              int *vhostfd,
+                              size_t *vhostfdSize);
 #endif /* __QEMU_INTERFACE_H__ */
-- 
2.5.0




More information about the libvir-list mailing list