On 6/28/21 11:18 AM, zhangjl02 wrote: > From: zhangjl02 <zhangjl02@xxxxxxxxxx> > > 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); Please separate variable declaration block and code block with an empty line. > + 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) This function can never return anything other than 0. > + VIR_WARN("cannot clear bandwidth setting for ovs device : %s", > + net->ifname); > + } > } > > retry: > Michal