qemu: Prepare netdev code for use of qemuFDPass for tapfd/vhostfd passing

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@redhat.com>
Reviewed-by: Jonathon Jongsma <jjongsma@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2022-05-09 16:45:12 +02:00
parent 3e9cc6e78e
commit 29458f0491
2 changed files with 62 additions and 5 deletions

View File

@ -4244,17 +4244,41 @@ qemuBuildHostNetProps(virDomainNetDef *net,
const char *vhostfd_field = "S:vhostfd";
g_autofree char *vhostfd_arg = NULL;
bool vhost = false;
size_t nfds;
GSList *n;
for (i = 0; i < tapfdSize; i++)
virBufferAsprintf(&buf, "%s:", tapfd[i]);
if (netpriv->tapfds) {
nfds = 0;
for (n = netpriv->tapfds; n; n = n->next) {
virBufferAsprintf(&buf, "%s:", qemuFDPassGetPath(n->data));
nfds++;
}
if (tapfdSize > 1)
tapfd_field = "s:fds";
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";
}
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++)
@ -8744,6 +8768,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;
@ -8952,6 +8977,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;

View File

@ -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;