[PATCH 4/4] qemu: interface: check and use ovs command to set qos of ovs managed port
Michal Prívozník
mprivozn at redhat.com
Tue Jun 29 12:59:35 UTC 2021
On 6/28/21 11:18 AM, zhangjl02 wrote:
> 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);
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
More information about the libvir-list
mailing list