[libvirt] [PATCH v2 05/12] qemu: Adapt command line generation to multiqueue net

Laine Stump laine at laine.org
Thu May 16 05:44:44 UTC 2013


On 05/13/2013 01:23 PM, Michal Privoznik wrote:
> The qemuBuildHostNetStr() function which is responsible for
> generating command line for a network interface needs to be aware
> of multiqueue network interface as we are required to use:
>  - fd=%d   in case of one FD
>  - fds=%d:%d:%d:...:%d   in case of multiple FDs
>
> These two approaches can't be mixed. Same applies for vhost FDs.
> ---
>  src/qemu/qemu_command.c | 46 +++++++++++++++++++++++++++++++++++++---------
>  src/qemu/qemu_command.h |  6 ++++--
>  src/qemu/qemu_hotplug.c | 10 ++++++----
>  3 files changed, 47 insertions(+), 15 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 7775471..ec061d1 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -4091,13 +4091,16 @@ qemuBuildHostNetStr(virDomainNetDefPtr net,
>                      virQEMUDriverPtr driver,
>                      char type_sep,
>                      int vlan,
> -                    const char *tapfd,
> -                    const char *vhostfd)
> +                    char **tapfd,
> +                    int tapfdSize,
> +                    char **vhostfd,
> +                    int vhostfdSize)
>  {
>      bool is_tap = false;
>      virBuffer buf = VIR_BUFFER_INITIALIZER;
>      enum virDomainNetType netType = virDomainNetGetActualType(net);
>      virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
> +    int i;
>  
>      if (net->script && netType != VIR_DOMAIN_NET_TYPE_ETHERNET) {
>          virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> @@ -4116,7 +4119,19 @@ qemuBuildHostNetStr(virDomainNetDefPtr net,
>      case VIR_DOMAIN_NET_TYPE_BRIDGE:
>      case VIR_DOMAIN_NET_TYPE_NETWORK:
>      case VIR_DOMAIN_NET_TYPE_DIRECT:
> -        virBufferAsprintf(&buf, "tap%cfd=%s", type_sep, tapfd);
> +        virBufferAsprintf(&buf, "tap%c", type_sep);
> +        /* for one tapfd 'fd=' shall be used,
> +         * for more than one 'fds=' is the right choice */
> +        if (tapfdSize == 1) {
> +            virBufferAsprintf(&buf, "fd=%s", tapfd[0]);
> +        } else {
> +            virBufferAddLit(&buf, "fds=");
> +            for (i = 0; i < tapfdSize; i++) {
> +                if (i)
> +                    virBufferAddChar(&buf, ':');
> +                virBufferAdd(&buf, tapfd[i], -1);
> +            }
> +        }
>          type_sep = ',';
>          is_tap = true;
>          break;
> @@ -4176,8 +4191,19 @@ qemuBuildHostNetStr(virDomainNetDefPtr net,
>      }
>  
>      if (is_tap) {
> -        if (vhostfd && *vhostfd)
> -            virBufferAsprintf(&buf, ",vhost=on,vhostfd=%s", vhostfd);
> +        if (vhostfdSize) {
> +            virBufferAddLit(&buf, ",vhost=on,");
> +            if (vhostfdSize == 1) {
> +                virBufferAsprintf(&buf, "vhostfd=%s", vhostfd[0]);
> +            } else {
> +                virBufferAddLit(&buf, "vhostfds=");
> +                for (i = 0; i < vhostfdSize; i++) {
> +                    if (i)
> +                        virBufferAddChar(&buf, ':');
> +                    virBufferAdd(&buf, vhostfd[i], -1);
> +                }
> +            }
> +        }
>          if (net->tune.sndbuf_specified)
>              virBufferAsprintf(&buf, ",sndbuf=%lu", net->tune.sndbuf);
>      }
> @@ -6436,8 +6462,9 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
>      if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
>          virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
>          if (!(host = qemuBuildHostNetStr(net, driver,
> -                                         ',', vlan, tapfdName,
> -                                         vhostfdName)))
> +                                         ',', vlan,
> +                                         &tapfdName, tapfdName ? 1 : 0,
> +                                         &vhostfdName, vhostfdName ?  1 : 0)))
>              goto cleanup;
>          virCommandAddArgList(cmd, "-netdev", host, NULL);
>      }
> @@ -6453,8 +6480,9 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
>      if (!(virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
>            virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) {
>          if (!(host = qemuBuildHostNetStr(net, driver,
> -                                         ',', vlan, tapfdName,
> -                                         vhostfdName)))
> +                                         ',', vlan,
> +                                         &tapfdName, tapfdName ? 1 : 0,
> +                                         &vhostfdName, vhostfdName ? 1 : 0)))
>              goto cleanup;
>          virCommandAddArgList(cmd, "-net", host, NULL);
>      }
> diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
> index ba42bb9..1068b4d 100644
> --- a/src/qemu/qemu_command.h
> +++ b/src/qemu/qemu_command.h
> @@ -73,8 +73,10 @@ char * qemuBuildHostNetStr(virDomainNetDefPtr net,
>                             virQEMUDriverPtr driver,
>                             char type_sep,
>                             int vlan,
> -                           const char *tapfd,
> -                           const char *vhostfd);
> +                           char **tapfd,
> +                           int tapfdSize,
> +                           char **vhostfd,
> +                           int vhostfdSize);
>  
>  /* Legacy, pre device support */
>  char * qemuBuildNicStr(virDomainNetDefPtr net,
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 41431b3..0a1845a 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -800,13 +800,15 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
>      if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_NETDEV) &&
>          virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
>          if (!(netstr = qemuBuildHostNetStr(net, driver,
> -                                           ',', -1, tapfd_name,
> -                                           vhostfd_name)))
> +                                           ',', -1,
> +                                           &tapfd_name, tapfd_name ? 1 : 0,
> +                                           &vhostfd_name, vhostfd_name ? 1 : 0)))
>              goto cleanup;
>      } else {
>          if (!(netstr = qemuBuildHostNetStr(net, driver,
> -                                           ' ', vlan, tapfd_name,
> -                                           vhostfd_name)))
> +                                           ' ', vlan,
> +                                           &tapfd_name, tapfd_name ? 1 : 0,
> +                                           &vhostfd_name, vhostfd_name ? 1 : 0)))
>              goto cleanup;
>      }
>  

ACK




More information about the libvir-list mailing list