[libvirt] [PATCH v2 20/23] qemu-command: use -net socket, fd= with slirp-helper

Michal Privoznik mprivozn at redhat.com
Fri Sep 6 11:36:29 UTC 2019


On 8/8/19 4:55 PM, marcandre.lureau at redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau at redhat.com>
> 
> If a slirp-helper is associated with a network interface (after
> probing & preparing succesfully), pass the socket fd to QEMU and use
> "-net socket,fd=".
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau at redhat.com>
> ---
>   src/qemu/qemu_command.c | 35 +++++++++++++++++++++++++++++------
>   src/qemu/qemu_command.h |  3 ++-
>   src/qemu/qemu_hotplug.c |  4 +++-
>   3 files changed, 34 insertions(+), 8 deletions(-)
> 
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 4357aa2fe1..90e61a336e 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -28,6 +28,7 @@
>   #include "qemu_alias.h"
>   #include "qemu_security.h"
>   #include "qemu_dbus.h"
> +#include "qemu_slirp.h"
>   #include "qemu_block.h"
>   #include "cpu/cpu.h"
>   #include "dirname.h"
> @@ -4008,7 +4009,8 @@ qemuBuildHostNetStr(virDomainNetDefPtr net,
>                       char **tapfd,
>                       size_t tapfdSize,
>                       char **vhostfd,
> -                    size_t vhostfdSize)
> +                    size_t vhostfdSize,
> +                    const char *slirpfd)
>   {
>       bool is_tap = false;
>       virBuffer buf = VIR_BUFFER_INITIALIZER;
> @@ -4079,6 +4081,12 @@ qemuBuildHostNetStr(virDomainNetDefPtr net,
>           break;
>   
>       case VIR_DOMAIN_NET_TYPE_USER:
> +        if (slirpfd) {
> +            virBufferAsprintf(&buf, "socket,fd=%s,",
> +                              slirpfd);
> +            break;
> +        }

No, please don't put a break at random places within 'case' bodies.

> +
>           virBufferAddLit(&buf, "user,");
>           for (i = 0; i < net->guestIP.nips; i++) {
>               const virNetDevIPAddr *ip = net->guestIP.ips[i];
> @@ -8634,10 +8642,10 @@ qemuInterfaceVhostuserConnect(virQEMUDriverPtr driver,
>   
>   static int
>   qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
> +                              virDomainObjPtr vm,
>                                 virLogManagerPtr logManager,
>                                 virSecurityManagerPtr secManager,
>                                 virCommandPtr cmd,
> -                              virDomainDefPtr def,
>                                 virDomainNetDefPtr net,
>                                 virQEMUCapsPtr qemuCaps,
>                                 unsigned int bootindex,
> @@ -8646,6 +8654,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
>                                 size_t *nnicindexes,
>                                 int **nicindexes)
>   {
> +    virDomainDefPtr def = vm->def;
>       int ret = -1;
>       char *nic = NULL;
>       char *host = NULL;
> @@ -8656,9 +8665,11 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
>       size_t vhostfdSize = 0;
>       char **tapfdName = NULL;
>       char **vhostfdName = NULL;
> +    VIR_AUTOFREE(char *) slirpfdName = NULL;
>       virDomainNetType actualType = virDomainNetGetActualType(net);
>       virNetDevBandwidthPtr actualBandwidth;
>       bool requireNicdev = false;
> +    qemuSlirpPtr slirp;
>       size_t i;
>   
>   
> @@ -8884,6 +8895,16 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
>               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);
> +        if (virAsprintf(&slirpfdName, "%d", slirpfd) < 0)
> +            goto cleanup;
> +    }
> +
> +
>       for (i = 0; i < tapfdSize; i++) {
>           if (qemuSecuritySetTapFDLabel(driver->securityManager,
>                                         def, tapfd[i]) < 0)
> @@ -8908,7 +8929,8 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
>   
>       if (!(host = qemuBuildHostNetStr(net, driver,
>                                        tapfdName, tapfdSize,
> -                                     vhostfdName, vhostfdSize)))
> +                                     vhostfdName, vhostfdSize,
> +                                     slirpfdName)))
>           goto cleanup;
>       virCommandAddArgList(cmd, "-netdev", host, NULL);
>   
> @@ -8976,10 +8998,10 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
>    */
>   static int
>   qemuBuildNetCommandLine(virQEMUDriverPtr driver,
> +                        virDomainObjPtr vm,
>                           virLogManagerPtr logManager,
>                           virSecurityManagerPtr secManager,
>                           virCommandPtr cmd,
> -                        virDomainDefPtr def,
>                           virQEMUCapsPtr qemuCaps,
>                           virNetDevVPortProfileOp vmop,
>                           bool standalone,
> @@ -8990,6 +9012,7 @@ qemuBuildNetCommandLine(virQEMUDriverPtr driver,
>       size_t i;
>       int last_good_net = -1;
>       virErrorPtr originalError = NULL;
> +    virDomainDefPtr def = vm->def;
>   
>       if (def->nnets) {
>           unsigned int bootNet = 0;
> @@ -9005,7 +9028,7 @@ qemuBuildNetCommandLine(virQEMUDriverPtr driver,
>           for (i = 0; i < def->nnets; i++) {
>               virDomainNetDefPtr net = def->nets[i];
>   
> -            if (qemuBuildInterfaceCommandLine(driver, logManager, secManager, cmd, def, net,
> +            if (qemuBuildInterfaceCommandLine(driver, vm, logManager, secManager, cmd, net,
>                                                 qemuCaps, bootNet, vmop,
>                                                 standalone, nnicindexes,
>                                                 nicindexes) < 0)
> @@ -10815,7 +10838,7 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
>       if (qemuBuildFilesystemCommandLine(cmd, def, qemuCaps) < 0)
>           goto error;
>   
> -    if (qemuBuildNetCommandLine(driver, logManager, secManager, cmd, def,
> +    if (qemuBuildNetCommandLine(driver, vm, logManager, secManager, cmd,
>                                   qemuCaps, vmop, standalone,
>                                   nnicindexes, nicindexes, &bootHostdevNet) < 0)
>           goto error;
> diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
> index 3a957c52fc..6faa6f2b18 100644
> --- a/src/qemu/qemu_command.h
> +++ b/src/qemu/qemu_command.h
> @@ -90,7 +90,8 @@ char *qemuBuildHostNetStr(virDomainNetDefPtr net,
>                             char **tapfd,
>                             size_t tapfdSize,
>                             char **vhostfd,
> -                          size_t vhostfdSize);
> +                          size_t vhostfdSize,
> +                          const char *slirpfd);
>   
>   /* Current, best practice */
>   char *qemuBuildNicDevStr(virDomainDefPtr def,
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 028921fb47..43c3f0755b 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -1135,6 +1135,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
>       qemuDomainObjPrivatePtr priv = vm->privateData;
>       virDomainDeviceDef dev = { VIR_DOMAIN_DEVICE_NET, { .net = net } };
>       virErrorPtr originalError = NULL;
> +    VIR_AUTOFREE(char *) slirpfdName = NULL;
>       char **tapfdName = NULL;
>       int *tapfd = NULL;
>       size_t tapfdSize = 0;
> @@ -1373,7 +1374,8 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
>   
>       if (!(netstr = qemuBuildHostNetStr(net, driver,
>                                          tapfdName, tapfdSize,
> -                                       vhostfdName, vhostfdSize)))
> +                                       vhostfdName, vhostfdSize,
> +                                       slirpfdName)))

This looks like a spurious change. Just pass NULL and introduce the 
variable once you need it.

Reviewed-by: Michal Privoznik <mprivozn at redhat.com>

Michal




More information about the libvir-list mailing list