[PATCH 1/2] virDomain: interface: add virNetDevOpenvswitchInterfaceClearTxQos and virNetDevOpenvswitchInterfaceClearRxQos.

Pavel Hrdina phrdina at redhat.com
Tue Aug 10 13:22:44 UTC 2021


On Mon, Aug 09, 2021 at 10:05:59AM +0800, zhangjl02 wrote:
> From: Jinsheng Zhang <zhangjl02 at 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 <zhangjl02 at 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
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20210810/ca83ab87/attachment-0001.sig>


More information about the libvir-list mailing list