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 >
signature.asc
Description: PGP signature