[PATCH 34/37] qemu: slirp: Pass FDs to qemu via qemuFDPass in the network private data

Jonathon Jongsma jjongsma at redhat.com
Fri May 13 19:24:58 UTC 2022


On 5/13/22 6:45 AM, Peter Krempa wrote:
> On Thu, May 12, 2022 at 14:07:00 -0500, Jonathon Jongsma wrote:
>> 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 at 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'.
> 
> This should not be the case:
> 
>      netpriv->slirpfd is initialized in qemuSlirpStart, which is called
>      from qemuExtDevicesStart which in turn is called from
>      qemuProcessLaunch. Now qemuProcessLaunch calls the command line
>      formatting machinery with standalone=false.
> 
>      Now the other code path which allows control of the 'standalone'
>      parameter is via qemuProcessCreatePretendCmdBuild, which actually
>      skips the call to qemuExtDevicesStart, thus the qemuFDPass object
>      will not be filled.
> 
> Now I think I'll actually remove the 'standalone' flag altogether as the
> only thing that it does is that the 'vhost' fds are not formatted, but
> in any case where we format those we already do use FD passing for the
> TAP device file descriptors so it won't make the commandline magically
> usable without libvirt anyways.
> 

OK, I guess I missed that.

Also, the name of the 'standalone' argument never really gave me a very 
good sense of what it was supposed to mean, so I'm in favor of removing 
it if possible.



More information about the libvir-list mailing list