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

zhangjl02 jx8zjs at 126.com
Mon Jun 28 09:18:23 UTC 2021


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);
+                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)
+                VIR_WARN("cannot clear bandwidth setting for ovs device : %s",
+                         net->ifname);
+        }
     }
 
  retry:
-- 
2.30.2.windows.1




More information about the libvir-list mailing list