[PATCH 4/4] qemu: interface: check and use ovs command to set qos of ovs managed port

Michal Prívozník mprivozn at redhat.com
Tue Jun 29 12:59:35 UTC 2021


On 6/28/21 11:18 AM, zhangjl02 wrote:
> From: zhangjl02 <zhangjl02 at inspur.com>
> 
> When qos is set or delete, we have to check if the port is an ovs managed
> port. If true, call the virNetDevOpenvswitchInterfaceSetQos function when qos
> is set, and call the virNetDevOpenvswitchInterfaceClearQos function when
> the interface is to be destroyed.
> ---
>  src/qemu/qemu_command.c | 10 ++++++++--
>  src/qemu/qemu_driver.c  | 21 ++++++++++++++++++++-
>  src/qemu/qemu_hotplug.c | 39 ++++++++++++++++++++++++++++-----------
>  src/qemu/qemu_process.c | 11 +++++++++--
>  4 files changed, 65 insertions(+), 16 deletions(-)
> 
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index ea513693f7..35085f293c 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -8610,8 +8610,14 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
>      actualBandwidth = virDomainNetGetActualBandwidth(net);
>      if (actualBandwidth) {
>          if (virNetDevSupportsBandwidth(actualType)) {
> -            if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false,
> -                                      !virDomainNetTypeSharesHostView(net)) < 0)
> +            if (qemuDomainDefIsOvsport(net, actualType)) {
> +                if (virNetDevOpenvswitchInterfaceSetQos(net->ifname, actualBandwidth,
> +                                                        def->uuid,
> +                                                        !virDomainNetTypeSharesHostView(net)) < 0)
> +                    goto cleanup;
> +            }
> +            else if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false,
> +                                           !virDomainNetTypeSharesHostView(net)) < 0)
>                  goto cleanup;
>          } else {
>              VIR_WARN("setting bandwidth on interfaces of "
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 235f575901..eefb67b404 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -10231,6 +10231,7 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
>      bool inboundSpecified = false, outboundSpecified = false;
>      int actualType;
>      bool qosSupported = true;
> +    bool ovsType = false;
>  
>      virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
>                    VIR_DOMAIN_AFFECT_CONFIG, -1);
> @@ -10277,6 +10278,7 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
>      if (net) {
>          actualType = virDomainNetGetActualType(net);
>          qosSupported = virNetDevSupportsBandwidth(actualType);
> +        ovsType = qemuDomainDefIsOvsport(net, actualType);
>      }
>  
>      if (qosSupported && persistentNet) {
> @@ -10366,7 +10368,24 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
>              }
>          }
>  
> -        if (virNetDevBandwidthSet(net->ifname, newBandwidth, false,
> +        if (ovsType){
> +            if (virNetDevOpenvswitchInterfaceSetQos(net->ifname, newBandwidth,
> +                                                    vm->def->uuid,
> +                                                    !virDomainNetTypeSharesHostView(net)) < 0){
> +                virErrorPtr orig_err;
> +                virErrorPreserveLast(&orig_err);

Please separate variable declaration block and code block with an empty
line.

> +                ignore_value(virNetDevOpenvswitchInterfaceSetQos(net->ifname, newBandwidth,
> +                                                                 vm->def->uuid,
> +                                                                 !virDomainNetTypeSharesHostView(net)));
> +                if (net->bandwidth) {
> +                    ignore_value(virDomainNetBandwidthUpdate(net,
> +                                                             net->bandwidth));
> +                }
> +                virErrorRestore(&orig_err);
> +                goto endjob;
> +            }
> +        }
> +        else if (virNetDevBandwidthSet(net->ifname, newBandwidth, false,
>                                    !virDomainNetTypeSharesHostView(net)) < 0) {
>              virErrorPtr orig_err;
>  
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index d2a354d026..4cf74072bc 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -1409,9 +1409,15 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
>      actualBandwidth = virDomainNetGetActualBandwidth(net);
>      if (actualBandwidth) {
>          if (virNetDevSupportsBandwidth(actualType)) {
> -            if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false,
> -                                      !virDomainNetTypeSharesHostView(net)) < 0)
> -                goto cleanup;
> +            if (qemuDomainDefIsOvsport(net, actualType)) {
> +                if (virNetDevOpenvswitchInterfaceSetQos(net->ifname, actualBandwidth,
> +                                                        vm->def->uuid,
> +                                                        !virDomainNetTypeSharesHostView(net)) < 0)
> +                    goto cleanup;
> +            }
> +            else if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false,
> +                                  !virDomainNetTypeSharesHostView(net)) < 0)
> +            goto cleanup;
>          } else {
>              VIR_WARN("setting bandwidth on interfaces of "
>                       "type '%s' is not implemented yet",
> @@ -3914,9 +3920,15 @@ qemuDomainChangeNet(virQEMUDriver *driver,
>          const virNetDevBandwidth *newb = virDomainNetGetActualBandwidth(newdev);
>  
>          if (newb) {
> -            if (virNetDevBandwidthSet(newdev->ifname, newb, false,
> -                                      !virDomainNetTypeSharesHostView(newdev)) < 0)
> -                goto cleanup;
> +            if (qemuDomainDefIsOvsport(newdev, newType)) {
> +                if (virNetDevOpenvswitchInterfaceSetQos(newdev->ifname, newb,
> +                                                        vm->def->uuid,
> +                                                        !virDomainNetTypeSharesHostView(newdev)) < 0)
> +                    goto cleanup;
> +            }
> +            else if (virNetDevBandwidthSet(newdev->ifname, newb, false,
> +                                  !virDomainNetTypeSharesHostView(newdev)) < 0)
> +            goto cleanup;
>          } else {
>              /*
>               * virNetDevBandwidthSet() doesn't clear any existing
> @@ -4665,11 +4677,16 @@ qemuDomainRemoveNetDevice(virQEMUDriver *driver,
>      if (!(charDevAlias = qemuAliasChardevFromDevAlias(net->info.alias)))
>          return -1;
>  
> -    if (virDomainNetGetActualBandwidth(net) &&
> -        virNetDevSupportsBandwidth(virDomainNetGetActualType(net)) &&
> -        virNetDevBandwidthClear(net->ifname) < 0)
> -        VIR_WARN("cannot clear bandwidth setting for device : %s",
> -                 net->ifname);
> +    if (virNetDevSupportsBandwidth(virDomainNetGetActualType(net))){
> +        if (qemuDomainDefIsOvsport(net, actualType)) {
> +            if (virNetDevOpenvswitchInterfaceClearQos(net->ifname, vm->def->uuid) < 0)
> +                VIR_WARN("cannot clear bandwidth setting for ovs device : %s",
> +                         net->ifname);
> +        }
> +        else if (virNetDevBandwidthClear(net->ifname) < 0)
> +            VIR_WARN("cannot clear bandwidth setting for device : %s",
> +                     net->ifname);
> +    }
>  
>      /* deactivate the tap/macvtap device on the host, which could also
>       * affect the parent device (e.g. macvtap passthrough mode sets
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 2b03b0ab98..3499f4548c 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -7818,6 +7818,7 @@ void qemuProcessStop(virQEMUDriver *driver,
>      g_autofree char *timestamp = NULL;
>      g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
>      g_autoptr(virConnect) conn = NULL;
> +    int actualType;
>  
>      VIR_DEBUG("Shutting down vm=%p name=%s id=%d pid=%lld, "
>                "reason=%s, asyncJob=%s, flags=0x%x",
> @@ -7966,8 +7967,8 @@ void qemuProcessStop(virQEMUDriver *driver,
>      for (i = 0; i < def->nnets; i++) {
>          virDomainNetDef *net = def->nets[i];
>          vport = virDomainNetGetActualVirtPortProfile(net);
> -
> -        switch (virDomainNetGetActualType(net)) {
> +        actualType = virDomainNetGetActualType(net);
> +        switch (actualType) {
>          case VIR_DOMAIN_NET_TYPE_DIRECT:
>              ignore_value(virNetDevMacVLanDeleteWithVPortProfile(
>                               net->ifname, &net->mac,
> @@ -8023,6 +8024,12 @@ void qemuProcessStop(virQEMUDriver *driver,
>              else
>                  VIR_WARN("Unable to release network device '%s'", NULLSTR(net->ifname));
>          }
> +        if ((actualType == VIR_DOMAIN_NET_TYPE_BRIDGE || actualType == VIR_DOMAIN_NET_TYPE_DIRECT) && vport  &&
> +            vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) {
> +            if (virNetDevOpenvswitchInterfaceClearQos(net->ifname, vm->def->uuid) < 0)

This function can never return anything other than 0.

> +                VIR_WARN("cannot clear bandwidth setting for ovs device : %s",
> +                         net->ifname);
> +        }
>      }
>  
>   retry:
> 

Michal




More information about the libvir-list mailing list