On Mon, Aug 09, 2021 at 10:05:59AM +0800, zhangjl02 wrote:
> From: Jinsheng Zhang <zhangj...@inspur.com>
> 
> Instead of cleaning all qos rules each time new qos is set, tx and rx's qos 
> can be set or clean respectively.
> Replace virReportError with VIR_WARN to let the cleaning process continue 
> when error occurs.
> Add ifname into ovs querying statements, which will reduce failure of 
> removing qos on the other interfaces of the same vm.
> Additionally, two problems is fixed.
> 1. Ingress rules is not clean on previous version of 
> virNetDevOpenvswitchInterfaceClearQos.
> 2. If errors occurs when removing inbound qos on multi interfaces vm, some 
> rules may not be delete as aspected.

The commit message should not have lines longer then 80 characters.

In addition this patch is doing a lot, please split it into several
commits:

    1) introductions of new functions
    2) usage of new functions
    3) fix single type if issue in a single commit

Pavel

> Signed-off-by: zhangjl02 <zhangj...@inspur.com>
> ---
>  src/libvirt_private.syms        |  2 +
>  src/util/virnetdevopenvswitch.c | 69 +++++++++++++++++++++++++++------
>  src/util/virnetdevopenvswitch.h |  7 ++++
>  3 files changed, 67 insertions(+), 11 deletions(-)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 6fc8239d2e..7366919d6c 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -2816,6 +2816,8 @@ virNetDevOpenvswitchAddPort;
>  virNetDevOpenvswitchGetMigrateData;
>  virNetDevOpenvswitchGetVhostuserIfname;
>  virNetDevOpenvswitchInterfaceClearQos;
> +virNetDevOpenvswitchInterfaceClearRxQos;
> +virNetDevOpenvswitchInterfaceClearTxQos;
>  virNetDevOpenvswitchInterfaceGetMaster;
>  virNetDevOpenvswitchInterfaceParseStats;
>  virNetDevOpenvswitchInterfaceSetQos;
> diff --git a/src/util/virnetdevopenvswitch.c b/src/util/virnetdevopenvswitch.c
> index 7a64a8dbe6..af9c611905 100644
> --- a/src/util/virnetdevopenvswitch.c
> +++ b/src/util/virnetdevopenvswitch.c
> @@ -778,6 +778,10 @@ virNetDevOpenvswitchInterfaceSetQos(const char *ifname,
>                  return -1;
>              }
>          }
> +    } else {
> +        if (virNetDevOpenvswitchInterfaceClearTxQos(ifname, vmid) < 0) {
> +            VIR_WARN("Clean tx qos for interface %s failed", ifname);
> +        }
>      }
>  
>      if (rx) {
> @@ -794,17 +798,23 @@ virNetDevOpenvswitchInterfaceSetQos(const char *ifname,
>                             _("Unable to set vlan configuration on port %s"), 
> ifname);
>              return -1;
>          }
> +    } else {
> +        if (virNetDevOpenvswitchInterfaceClearRxQos(ifname) < 0) {
> +            VIR_WARN("Clean rx qos for interface %s failed", ifname);
> +        }
>      }
>  
>      return 0;
>  }
>  
>  int
> -virNetDevOpenvswitchInterfaceClearQos(const char *ifname,
> -                                      const unsigned char *vmid)
> +virNetDevOpenvswitchInterfaceClearTxQos(const char *ifname,
> +                                        const unsigned char *vmid)
>  {
> +    int ret = 0;
>      char vmuuidstr[VIR_UUID_STRING_BUFLEN];
>      g_autoptr(virCommand) cmd = NULL;
> +    g_autofree char *ifname_ex_id = NULL;
>      g_autofree char *vmid_ex_id = NULL;
>      g_autofree char *qos_uuid = NULL;
>      g_autofree char *queue_uuid = NULL;
> @@ -815,7 +825,8 @@ virNetDevOpenvswitchInterfaceClearQos(const char *ifname,
>      cmd = virNetDevOpenvswitchCreateCmd();
>      virUUIDFormat(vmid, vmuuidstr);
>      vmid_ex_id = g_strdup_printf("external-ids:vm-id=\"%s\"", vmuuidstr);
> -    virCommandAddArgList(cmd, "--no-heading", "--columns=_uuid", "find", 
> "qos", vmid_ex_id, NULL);
> +    ifname_ex_id = g_strdup_printf("external-ids:ifname=\"%s\"", ifname);
> +    virCommandAddArgList(cmd, "--no-heading", "--columns=_uuid", "find", 
> "qos", vmid_ex_id, ifname_ex_id, NULL);
>      virCommandSetOutputBuffer(cmd, &qos_uuid);
>      if (virCommandRun(cmd, NULL) < 0) {
>          VIR_WARN("Unable to find qos on port %s", ifname);
> @@ -825,7 +836,7 @@ virNetDevOpenvswitchInterfaceClearQos(const char *ifname,
>      virCommandFree(cmd);
>      cmd = virNetDevOpenvswitchCreateCmd();
>      vmid_ex_id = g_strdup_printf("external-ids:vm-id=\"%s\"", vmuuidstr);
> -    virCommandAddArgList(cmd, "--no-heading", "--columns=_uuid", "find", 
> "queue", vmid_ex_id, NULL);
> +    virCommandAddArgList(cmd, "--no-heading", "--columns=_uuid", "find", 
> "queue", vmid_ex_id, ifname_ex_id, NULL);
>      virCommandSetOutputBuffer(cmd, &queue_uuid);
>      if (virCommandRun(cmd, NULL) < 0) {
>          VIR_WARN("Unable to find queue on port %s", ifname);
> @@ -843,7 +854,7 @@ virNetDevOpenvswitchInterfaceClearQos(const char *ifname,
>              virCommandFree(cmd);
>              cmd = virNetDevOpenvswitchCreateCmd();
>              virCommandAddArgList(cmd, "--no-heading", "--columns=_uuid", 
> "--if-exists",
> -                    "list", "port", ifname, "qos", NULL);
> +                                 "list", "port", ifname, "qos", NULL);
>              virCommandSetOutputBuffer(cmd, &port_qos);
>              if (virCommandRun(cmd, NULL) < 0) {
>                  VIR_WARN("Unable to remove port qos on port %s", ifname);
> @@ -860,9 +871,8 @@ virNetDevOpenvswitchInterfaceClearQos(const char *ifname,
>              cmd = virNetDevOpenvswitchCreateCmd();
>              virCommandAddArgList(cmd, "destroy", "qos", line, NULL);
>              if (virCommandRun(cmd, NULL) < 0) {
> -                virReportError(VIR_ERR_INTERNAL_ERROR,
> -                               _("Unable to destroy qos on port %s"), 
> ifname);
> -                return -1;
> +                VIR_WARN("Unable to destroy qos on port %s", ifname);
> +                ret = -1;
>              }
>          }
>      }
> @@ -879,12 +889,49 @@ virNetDevOpenvswitchInterfaceClearQos(const char 
> *ifname,
>              cmd = virNetDevOpenvswitchCreateCmd();
>              virCommandAddArgList(cmd, "destroy", "queue", line, NULL);
>              if (virCommandRun(cmd, NULL) < 0) {
> -                virReportError(VIR_ERR_INTERNAL_ERROR,
> -                               _("Unable to destroy queue on port %s"), 
> ifname);
> -                return -1;
> +                VIR_WARN("Unable to destroy queue on port %s", ifname);
> +                ret = -1;
>              }
>          }
>      }
>  
> +    return ret;
> +}
> +
> +int
> +virNetDevOpenvswitchInterfaceClearRxQos(const char *ifname)
> +{
> +    g_autoptr(virCommand) cmd = NULL;
> +
> +    cmd = virNetDevOpenvswitchCreateCmd();
> +    virCommandAddArgList(cmd, "set", "Interface", ifname, NULL);
> +    virCommandAddArgFormat(cmd, "ingress_policing_rate=%llu", 0llu);
> +    virCommandAddArgFormat(cmd, "ingress_policing_burst=%llu", 0llu);
> +
> +    if (virCommandRun(cmd, NULL) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Unable to set vlan configuration on port %s"), 
> ifname);
> +        return -1;
> +    }
> +
>      return 0;
>  }
> +
> +int
> +virNetDevOpenvswitchInterfaceClearQos(const char *ifname,
> +                                      const unsigned char *vmid)
> +{
> +    int ret = 0;
> +
> +    if (virNetDevOpenvswitchInterfaceClearTxQos(ifname, vmid) < 0) {
> +        VIR_WARN("Clean tx qos for interface %s failed", ifname);
> +        ret = -1;
> +    }
> +
> +    if (virNetDevOpenvswitchInterfaceClearRxQos(ifname) < 0) {
> +        VIR_WARN("Clean rx qos for interface %s failed", ifname);
> +        ret = -1;
> +    }
> +
> +    return ret;
> +}
> diff --git a/src/util/virnetdevopenvswitch.h b/src/util/virnetdevopenvswitch.h
> index 2dcd1aec6b..d44072cc8c 100644
> --- a/src/util/virnetdevopenvswitch.h
> +++ b/src/util/virnetdevopenvswitch.h
> @@ -80,3 +80,10 @@ int virNetDevOpenvswitchInterfaceSetQos(const char *ifname,
>  int virNetDevOpenvswitchInterfaceClearQos(const char *ifname,
>                                            const unsigned char *vmid)
>      ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT;
> +
> +int virNetDevOpenvswitchInterfaceClearRxQos(const char *ifname)
> +    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT;
> +
> +int virNetDevOpenvswitchInterfaceClearTxQos(const char *ifname,
> +                                          const unsigned char *vmid)
> +    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT;
> -- 
> 2.30.2.windows.1
> 

Attachment: signature.asc
Description: PGP signature

Reply via email to