From: Jinsheng Zhang <zhangjl02(a)inspur.com>
Separate virNetDevOpenvswitchInterfaceClearQos into two steps. When setting
qos, we can set only rx or tx and the other one should be cleared.
Signed-off-by: zhangjl02 <zhangjl02(a)inspur.com>
---
src/libvirt_private.syms | 2 ++
src/util/virnetdevopenvswitch.c | 50 +++++++++++++++++++++++++++++++--
src/util/virnetdevopenvswitch.h | 7 +++++
3 files changed, 57 insertions(+), 2 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 51a400ba59..841cd08435 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 e8ec06d3db..7c13e1764f 100644
--- a/src/util/virnetdevopenvswitch.c
+++ b/src/util/virnetdevopenvswitch.c
@@ -781,6 +781,10 @@ virNetDevOpenvswitchInterfaceSetQos(const char *ifname,
return -1;
}
}
+ } else {
+ if (virNetDevOpenvswitchInterfaceClearTxQos(ifname, vmuuid) < 0) {
+ VIR_WARN("Clean tx qos for interface %s failed", ifname);
+ }
}
if (rx) {
@@ -799,14 +803,18 @@ 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 *vmuuid)
+virNetDevOpenvswitchInterfaceClearTxQos(const char *ifname,
+ const unsigned char *vmuuid)
{
char vmuuidstr[VIR_UUID_STRING_BUFLEN];
g_autoptr(virCommand) cmd = NULL;
@@ -883,3 +891,41 @@ virNetDevOpenvswitchInterfaceClearQos(const char *ifname,
return 0;
}
+
+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 *vmuuid)
+{
+ int ret = 0;
+
+ if (virNetDevOpenvswitchInterfaceClearTxQos(ifname, vmuuid) < 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 33e52f57c7..cea5f4616d 100644
--- a/src/util/virnetdevopenvswitch.h
+++ b/src/util/virnetdevopenvswitch.h
@@ -87,3 +87,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