On 5/10/22 10:20 AM, Peter Krempa wrote:
Populate the 'slirpfd' qemuFDPass structure inside the
private data for
passing the fd to qemu rather than using out-of-band variables.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_command.c | 27 +++++++++------------------
src/qemu/qemu_command.h | 3 +--
src/qemu/qemu_hotplug.c | 9 +++------
src/qemu/qemu_slirp.c | 8 +++++++-
4 files changed, 20 insertions(+), 27 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 92b91b0a52..e48b59abbb 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4186,8 +4186,7 @@ qemuBuildNicDevProps(virDomainDef *def,
virJSONValue *
-qemuBuildHostNetProps(virDomainNetDef *net,
- const char *slirpfd)
+qemuBuildHostNetProps(virDomainNetDef *net)
{
virDomainNetType netType = virDomainNetGetActualType(net);
size_t i;
@@ -4302,9 +4301,11 @@ qemuBuildHostNetProps(virDomainNetDef *net,
break;
case VIR_DOMAIN_NET_TYPE_USER:
- if (slirpfd) {
- if (virJSONValueObjectAdd(&netprops, "s:type",
"socket", NULL) < 0 ||
- virJSONValueObjectAppendString(netprops, "fd", slirpfd) <
0)
+ if (netpriv->slirpfd) {
+ if (virJSONValueObjectAdd(&netprops,
+ "s:type", "socket",
+ "s:fd",
qemuFDPassGetPath(netpriv->slirpfd),
+ NULL) < 0)
return NULL;
} else {
if (virJSONValueObjectAdd(&netprops, "s:type",
"user", NULL) < 0)
@@ -8760,11 +8761,9 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
int ret = -1;
g_autoptr(virJSONValue) nicprops = NULL;
g_autofree char *nic = NULL;
- g_autofree char *slirpfdName = NULL;
virDomainNetType actualType = virDomainNetGetActualType(net);
const virNetDevBandwidth *actualBandwidth;
bool requireNicdev = false;
- qemuSlirp *slirp;
g_autoptr(virJSONValue) hostnetprops = NULL;
qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
GSList *n;
@@ -8890,14 +8889,6 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
virNetDevSetMTU(net->ifname, net->mtu) < 0)
goto cleanup;
- slirp = QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp;
- if (slirp && !standalone) {
- int slirpfd = qemuSlirpGetFD(slirp);
- virCommandPassFD(cmd, slirpfd,
- VIR_COMMAND_PASS_FD_CLOSE_PARENT);
- slirpfdName = g_strdup_printf("%d", slirpfd);
- }
-
for (n = netpriv->tapfds; n; n = n->next) {
if (qemuFDPassTransferCommand(n->data, cmd) < 0)
return -1;
@@ -8908,11 +8899,11 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
return -1;
}
- if (qemuFDPassTransferCommand(netpriv->vdpafd, cmd) < 0)
+ if (qemuFDPassTransferCommand(netpriv->slirpfd, cmd) < 0 ||
+ qemuFDPassTransferCommand(netpriv->vdpafd, cmd) < 0)
return -1;
If I'm reading this correctly, there's a small behavior change here when
'standalone' is true. Previously we were not passing the slirpfd in that
case, but now it looks like we will to pass it regardless of the value
of 'standalone'.
Reviewed-by: Jonathon Jongsma <jjongsma(a)redhat.com>
- if (!(hostnetprops = qemuBuildHostNetProps(net,
- slirpfdName)))
+ if (!(hostnetprops = qemuBuildHostNetProps(net)))
goto cleanup;
if (qemuBuildNetdevCommandlineFromJSON(cmd, hostnetprops, qemuCaps) < 0)
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
index 9bb63d9598..84877b3d90 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -86,8 +86,7 @@ virJSONValue *
qemuBuildChannelGuestfwdNetdevProps(virDomainChrDef *chr);
virJSONValue *
-qemuBuildHostNetProps(virDomainNetDef *net,
- const char *slirpfd);
+qemuBuildHostNetProps(virDomainNetDef *net);
int
qemuBuildInterfaceConnect(virDomainObj *vm,
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 8f5e971570..3f368551e3 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1318,9 +1318,6 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
"%s", _("Failed to start slirp"));
goto cleanup;
}
-
- slirpfd = qemuSlirpGetFD(slirp);
- slirpfdName = g_strdup_printf("slirpfd-%s", net->info.alias);
}
break;
@@ -1376,8 +1373,7 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
virNetDevSetMTU(net->ifname, net->mtu) < 0)
goto cleanup;
- if (!(netprops = qemuBuildHostNetProps(net,
- slirpfdName)))
+ if (!(netprops = qemuBuildHostNetProps(net)))
goto cleanup;
qemuDomainObjEnterMonitor(driver, vm);
@@ -1396,7 +1392,8 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
}
}
- if (qemuFDPassTransferMonitor(netpriv->vdpafd, priv->mon) < 0) {
+ if (qemuFDPassTransferMonitor(netpriv->slirpfd, priv->mon) < 0 ||
+ qemuFDPassTransferMonitor(netpriv->vdpafd, priv->mon) < 0) {
qemuDomainObjExitMonitor(vm);
goto cleanup;
}
diff --git a/src/qemu/qemu_slirp.c b/src/qemu/qemu_slirp.c
index 136e4b29d2..b62934f292 100644
--- a/src/qemu/qemu_slirp.c
+++ b/src/qemu/qemu_slirp.c
@@ -251,7 +251,8 @@ qemuSlirpStart(virDomainObj *vm,
{
qemuDomainObjPrivate *priv = vm->privateData;
virQEMUDriver *driver = priv->driver;
- qemuSlirp *slirp = QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp;
+ qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
+ qemuSlirp *slirp = netpriv->slirp;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
g_autoptr(virCommand) cmd = NULL;
g_autofree char *pidfile = NULL;
@@ -262,6 +263,7 @@ qemuSlirpStart(virDomainObj *vm,
int cmdret = 0;
VIR_AUTOCLOSE errfd = -1;
bool killDBusDaemon = false;
+ g_autofree char *fdname = g_strdup_printf("slirpfd-%s",
net->info.alias);
if (!slirp)
return 0;
@@ -359,6 +361,10 @@ qemuSlirpStart(virDomainObj *vm,
slirp->pid = pid;
+ netpriv->slirpfd = qemuFDPassNewDirect(fdname, priv);
+
+ qemuFDPassAddFD(netpriv->slirpfd, &slirp->fd[0], NULL);
+
return 0;
error: