qemu: slirp: Pass FDs to qemu via qemuFDPass in the network private data

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@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-10 16:45:12 +02:00
parent 812a36557d
commit c8633d35ca
4 changed files with 20 additions and 27 deletions

View File

@@ -4207,8 +4207,7 @@ qemuBuildNicDevProps(virDomainDef *def,
virJSONValue * virJSONValue *
qemuBuildHostNetProps(virDomainNetDef *net, qemuBuildHostNetProps(virDomainNetDef *net)
const char *slirpfd)
{ {
virDomainNetType netType = virDomainNetGetActualType(net); virDomainNetType netType = virDomainNetGetActualType(net);
size_t i; size_t i;
@@ -4323,9 +4322,11 @@ qemuBuildHostNetProps(virDomainNetDef *net,
break; break;
case VIR_DOMAIN_NET_TYPE_USER: case VIR_DOMAIN_NET_TYPE_USER:
if (slirpfd) { if (netpriv->slirpfd) {
if (virJSONValueObjectAdd(&netprops, "s:type", "socket", NULL) < 0 || if (virJSONValueObjectAdd(&netprops,
virJSONValueObjectAppendString(netprops, "fd", slirpfd) < 0) "s:type", "socket",
"s:fd", qemuFDPassGetPath(netpriv->slirpfd),
NULL) < 0)
return NULL; return NULL;
} else { } else {
if (virJSONValueObjectAdd(&netprops, "s:type", "user", NULL) < 0) if (virJSONValueObjectAdd(&netprops, "s:type", "user", NULL) < 0)
@@ -8782,11 +8783,9 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
int ret = -1; int ret = -1;
g_autoptr(virJSONValue) nicprops = NULL; g_autoptr(virJSONValue) nicprops = NULL;
g_autofree char *nic = NULL; g_autofree char *nic = NULL;
g_autofree char *slirpfdName = NULL;
virDomainNetType actualType = virDomainNetGetActualType(net); virDomainNetType actualType = virDomainNetGetActualType(net);
const virNetDevBandwidth *actualBandwidth; const virNetDevBandwidth *actualBandwidth;
bool requireNicdev = false; bool requireNicdev = false;
qemuSlirp *slirp;
g_autoptr(virJSONValue) hostnetprops = NULL; g_autoptr(virJSONValue) hostnetprops = NULL;
qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net); qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
GSList *n; GSList *n;
@@ -8912,14 +8911,6 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
virNetDevSetMTU(net->ifname, net->mtu) < 0) virNetDevSetMTU(net->ifname, net->mtu) < 0)
goto cleanup; 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) { for (n = netpriv->tapfds; n; n = n->next) {
if (qemuFDPassTransferCommand(n->data, cmd) < 0) if (qemuFDPassTransferCommand(n->data, cmd) < 0)
return -1; return -1;
@@ -8930,11 +8921,11 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
return -1; return -1;
} }
if (qemuFDPassTransferCommand(netpriv->vdpafd, cmd) < 0) if (qemuFDPassTransferCommand(netpriv->slirpfd, cmd) < 0 ||
qemuFDPassTransferCommand(netpriv->vdpafd, cmd) < 0)
return -1; return -1;
if (!(hostnetprops = qemuBuildHostNetProps(net, if (!(hostnetprops = qemuBuildHostNetProps(net)))
slirpfdName)))
goto cleanup; goto cleanup;
if (qemuBuildNetdevCommandlineFromJSON(cmd, hostnetprops, qemuCaps) < 0) if (qemuBuildNetdevCommandlineFromJSON(cmd, hostnetprops, qemuCaps) < 0)

View File

@@ -86,8 +86,7 @@ virJSONValue *
qemuBuildChannelGuestfwdNetdevProps(virDomainChrDef *chr); qemuBuildChannelGuestfwdNetdevProps(virDomainChrDef *chr);
virJSONValue * virJSONValue *
qemuBuildHostNetProps(virDomainNetDef *net, qemuBuildHostNetProps(virDomainNetDef *net);
const char *slirpfd);
int int
qemuBuildInterfaceConnect(virDomainObj *vm, qemuBuildInterfaceConnect(virDomainObj *vm,

View File

@@ -1318,9 +1318,6 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
"%s", _("Failed to start slirp")); "%s", _("Failed to start slirp"));
goto cleanup; goto cleanup;
} }
slirpfd = qemuSlirpGetFD(slirp);
slirpfdName = g_strdup_printf("slirpfd-%s", net->info.alias);
} }
break; break;
@@ -1376,8 +1373,7 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
virNetDevSetMTU(net->ifname, net->mtu) < 0) virNetDevSetMTU(net->ifname, net->mtu) < 0)
goto cleanup; goto cleanup;
if (!(netprops = qemuBuildHostNetProps(net, if (!(netprops = qemuBuildHostNetProps(net)))
slirpfdName)))
goto cleanup; goto cleanup;
qemuDomainObjEnterMonitor(driver, vm); 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); qemuDomainObjExitMonitor(vm);
goto cleanup; goto cleanup;
} }

View File

@@ -251,7 +251,8 @@ qemuSlirpStart(virDomainObj *vm,
{ {
qemuDomainObjPrivate *priv = vm->privateData; qemuDomainObjPrivate *priv = vm->privateData;
virQEMUDriver *driver = priv->driver; 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(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
g_autoptr(virCommand) cmd = NULL; g_autoptr(virCommand) cmd = NULL;
g_autofree char *pidfile = NULL; g_autofree char *pidfile = NULL;
@@ -262,6 +263,7 @@ qemuSlirpStart(virDomainObj *vm,
int cmdret = 0; int cmdret = 0;
VIR_AUTOCLOSE errfd = -1; VIR_AUTOCLOSE errfd = -1;
bool killDBusDaemon = false; bool killDBusDaemon = false;
g_autofree char *fdname = g_strdup_printf("slirpfd-%s", net->info.alias);
if (!slirp) if (!slirp)
return 0; return 0;
@@ -359,6 +361,10 @@ qemuSlirpStart(virDomainObj *vm,
slirp->pid = pid; slirp->pid = pid;
netpriv->slirpfd = qemuFDPassNewDirect(fdname, priv);
qemuFDPassAddFD(netpriv->slirpfd, &slirp->fd[0], NULL);
return 0; return 0;
error: error: