Use the new infrastructure which stores the fds inside 'qemuFDPass'
objects in the private data.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_command.c | 82 ++++++++++++++++++++---------------------
src/qemu/qemu_command.h | 1 +
src/qemu/qemu_hotplug.c | 36 ++----------------
3 files changed, 44 insertions(+), 75 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index d23baa54a2..78baa840a8 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -8661,6 +8661,7 @@ qemuInterfaceVhostuserConnect(virCommand *cmd,
int
qemuBuildInterfaceConnect(virDomainObj *vm,
virDomainNetDef *net,
+ virNetDevVPortProfileOp vmop,
bool standalone)
{
@@ -8668,19 +8669,33 @@ qemuBuildInterfaceConnect(virDomainObj *vm,
virDomainNetType actualType = virDomainNetGetActualType(net);
qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
VIR_AUTOCLOSE vdpafd = -1;
- bool vhostfd = false;
+ bool vhostfd = false; /* also used to signal processing of tapfds */
+ size_t tapfdSize = net->driver.virtio.queues;
+ g_autofree int *tapfd = g_new0(int, tapfdSize + 1);
+
+ if (tapfdSize == 0)
+ tapfdSize = 1;
switch (actualType) {
case VIR_DOMAIN_NET_TYPE_NETWORK:
case VIR_DOMAIN_NET_TYPE_BRIDGE:
vhostfd = true;
+ if (qemuInterfaceBridgeConnect(vm->def, priv->driver, net,
+ tapfd, &tapfdSize) < 0)
+ return -1;
break;
case VIR_DOMAIN_NET_TYPE_DIRECT:
vhostfd = true;
+ if (qemuInterfaceDirectConnect(vm->def, priv->driver, net,
+ tapfd, tapfdSize, vmop) < 0)
+ return -1;
break;
case VIR_DOMAIN_NET_TYPE_ETHERNET:
+ if (qemuInterfaceEthernetConnect(vm->def, priv->driver, net,
+ tapfd, tapfdSize) < 0)
+ return -1;
vhostfd = true;
break;
@@ -8706,6 +8721,29 @@ qemuBuildInterfaceConnect(virDomainObj *vm,
break;
}
+ /* 'vhostfd' is set to true in all cases when we need to process tapfds */
+ if (vhostfd) {
+ g_autofree char *prefix = g_strdup_printf("tapfd-%s",
net->info.alias);
+ size_t i;
+
+ for (i = 0; i < tapfdSize; i++) {
+ g_autoptr(qemuFDPass) pass = qemuFDPassNewDirect(prefix, priv);
+ g_autofree char *suffix = g_strdup_printf("%zu", i);
+ int fd = tapfd[i]; /* we want to keep the array intact for security
labeling*/
+
+ qemuFDPassAddFD(pass, &fd, suffix);
+ netpriv->tapfds = g_slist_prepend(netpriv->tapfds,
g_steal_pointer(&pass));
+ }
+
+ netpriv->tapfds = g_slist_reverse(netpriv->tapfds);
+
+ for (i = 0; i < tapfdSize; i++) {
+ if (qemuSecuritySetTapFDLabel(priv->driver->securityManager,
+ vm->def, tapfd[i]) < 0)
+ return -1;
+ }
+ }
+
if (vhostfd && !standalone) {
if (qemuInterfaceOpenVhostNet(vm, net) < 0)
return -1;
@@ -8746,54 +8784,14 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
if (qemuDomainValidateActualNetDef(net, qemuCaps) < 0)
return -1;
- if (qemuBuildInterfaceConnect(vm, net, standalone) < 0)
+ if (qemuBuildInterfaceConnect(vm, net, vmop, standalone) < 0)
return -1;
switch (actualType) {
case VIR_DOMAIN_NET_TYPE_NETWORK:
case VIR_DOMAIN_NET_TYPE_BRIDGE:
- tapfdSize = net->driver.virtio.queues;
- if (!tapfdSize)
- tapfdSize = 1;
-
- tapfd = g_new0(int, tapfdSize);
- tapfdName = g_new0(char *, tapfdSize);
-
- memset(tapfd, -1, tapfdSize * sizeof(tapfd[0]));
-
- if (qemuInterfaceBridgeConnect(def, driver, net,
- tapfd, &tapfdSize) < 0)
- goto cleanup;
- break;
-
case VIR_DOMAIN_NET_TYPE_DIRECT:
- tapfdSize = net->driver.virtio.queues;
- if (!tapfdSize)
- tapfdSize = 1;
-
- tapfd = g_new0(int, tapfdSize);
- tapfdName = g_new0(char *, tapfdSize);
-
- memset(tapfd, -1, tapfdSize * sizeof(tapfd[0]));
-
- if (qemuInterfaceDirectConnect(def, driver, net,
- tapfd, tapfdSize, vmop) < 0)
- goto cleanup;
- break;
-
case VIR_DOMAIN_NET_TYPE_ETHERNET:
- tapfdSize = net->driver.virtio.queues;
- if (!tapfdSize)
- tapfdSize = 1;
-
- tapfd = g_new0(int, tapfdSize);
- tapfdName = g_new0(char *, tapfdSize);
-
- memset(tapfd, -1, tapfdSize * sizeof(tapfd[0]));
-
- if (qemuInterfaceEthernetConnect(def, driver, net,
- tapfd, tapfdSize) < 0)
- goto cleanup;
break;
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
index c26305927e..5a65d94d6f 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -94,6 +94,7 @@ qemuBuildHostNetProps(virDomainNetDef *net,
int
qemuBuildInterfaceConnect(virDomainObj *vm,
virDomainNetDef *net,
+ virNetDevVPortProfileOp vmop,
bool standalone);
/* Current, best practice */
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index f7d3b38a6a..9c6f9e673c 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1274,46 +1274,16 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
*/
VIR_APPEND_ELEMENT_COPY(vm->def->nets, vm->def->nnets, net);
- if (qemuBuildInterfaceConnect(vm, net, false) < 0)
+ if (qemuBuildInterfaceConnect(vm, net, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, false)
< 0)
return -1;
+ iface_connected = true;
+
switch (actualType) {
case VIR_DOMAIN_NET_TYPE_BRIDGE:
case VIR_DOMAIN_NET_TYPE_NETWORK:
- tapfdSize = net->driver.virtio.queues;
- if (!tapfdSize)
- tapfdSize = 1;
- tapfd = g_new0(int, tapfdSize);
- memset(tapfd, -1, sizeof(*tapfd) * tapfdSize);
- if (qemuInterfaceBridgeConnect(vm->def, driver, net,
- tapfd, &tapfdSize) < 0)
- goto cleanup;
- iface_connected = true;
- break;
-
case VIR_DOMAIN_NET_TYPE_DIRECT:
- tapfdSize = net->driver.virtio.queues;
- if (!tapfdSize)
- tapfdSize = 1;
- tapfd = g_new0(int, tapfdSize);
- memset(tapfd, -1, sizeof(*tapfd) * tapfdSize);
- if (qemuInterfaceDirectConnect(vm->def, driver, net,
- tapfd, tapfdSize,
- VIR_NETDEV_VPORT_PROFILE_OP_CREATE) < 0)
- goto cleanup;
- iface_connected = true;
- break;
-
case VIR_DOMAIN_NET_TYPE_ETHERNET:
- tapfdSize = net->driver.virtio.queues;
- if (!tapfdSize)
- tapfdSize = 1;
- tapfd = g_new0(int, tapfdSize);
- memset(tapfd, -1, sizeof(*tapfd) * tapfdSize);
- if (qemuInterfaceEthernetConnect(vm->def, driver, net,
- tapfd, tapfdSize) < 0)
- goto cleanup;
- iface_connected = true;
break;
case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
--
2.35.1