From 46c7846d04eb79d555fd36ad0c02c84f851e8e4d Mon Sep 17 00:00:00 2001 From: Ruben Bosch Date: Tue, 1 Apr 2025 15:36:26 +0200 Subject: [PATCH 1/2] Network rate must be multiplied by 125 not 128 In a libvirt domain xml when nw_rate=5000 the kilobytes per second configured in the interface is 640000 which is 5.12 Gbit/s. Which is more than the configured network rate of 5Gbit/s. So instead multiply by 125. --- .../hypervisor/kvm/resource/BridgeVifDriver.java | 2 +- .../hypervisor/kvm/resource/DirectVifDriver.java | 4 ++-- .../cloud/hypervisor/kvm/resource/IvsVifDriver.java | 2 +- .../cloud/hypervisor/kvm/resource/OvsVifDriver.java | 4 ++-- .../cloud/hypervisor/kvm/resource/VifDriverBase.java | 11 +++++++++++ 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java index 26b8de530837..34e114ea59db 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java @@ -207,7 +207,7 @@ public LibvirtVMDef.InterfaceDef plug(NicTO nic, String guestOsType, String nicA String trafficLabel = nic.getName(); Integer networkRateKBps = 0; if (libvirtVersion > ((10 * 1000 + 10))) { - networkRateKBps = (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) ? nic.getNetworkRateMbps().intValue() * 128 : 0; + networkRateKBps = getNetworkRateKbps(nic); } if (nic.getType() == Networks.TrafficType.Guest) { diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/DirectVifDriver.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/DirectVifDriver.java index 71afc9409328..580621b39a75 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/DirectVifDriver.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/DirectVifDriver.java @@ -30,7 +30,6 @@ public class DirectVifDriver extends VifDriverBase { - /** * Experimental driver to configure direct networking in libvirt. This should only * be used on an LXC cluster that does not run any system VMs. @@ -42,13 +41,14 @@ public class DirectVifDriver extends VifDriverBase { * @throws InternalErrorException * @throws LibvirtException */ + @Override public LibvirtVMDef.InterfaceDef plug(NicTO nic, String guestOsType, String nicAdapter, Map extraConfig) throws InternalErrorException, LibvirtException { LibvirtVMDef.InterfaceDef intf = new LibvirtVMDef.InterfaceDef(); if (Sets.newHashSet(Networks.TrafficType.Guest, Networks.TrafficType.Public).contains(nic.getType())) { - Integer networkRateKBps = (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) ? nic.getNetworkRateMbps().intValue() * 128 : 0; + Integer networkRateKBps = getNetworkRateKbps(nic); intf.defDirectNet(_libvirtComputingResource.getNetworkDirectDevice(), null, nic.getMac(), getGuestNicModel(guestOsType, nicAdapter), _libvirtComputingResource.getNetworkDirectSourceMode(), networkRateKBps); } diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java index 2386e7d2d590..bbe87aa13735 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java @@ -93,7 +93,7 @@ public InterfaceDef plug(NicTO nic, String guestOsType, String nicAdapter, Map _pifs; protected Map _bridges; + protected static final int bitsPerMbpsToKbps = 125; + @Override public void configure(Map params) throws ConfigurationException { _libvirtComputingResource = (LibvirtComputingResource)params.get("libvirt.computing.resource"); @@ -78,4 +80,13 @@ protected LibvirtVMDef.InterfaceDef.NicModel getGuestNicModel(String platformEmu public boolean isExistingBridge(String bridgeName) { return false; } + + protected static int getNetworkRateKbps(NicTO nic) { + if (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) { + return nic.getNetworkRateMbps().intValue() * bitsPerMbpsToKbps; + } + else { + return 0; + } + } } From eaa964f74b7337da0399e193c41ed3b29d933cd5 Mon Sep 17 00:00:00 2001 From: Ruben Bosch <8641284+Rubueno@users.noreply.github.com> Date: Mon, 11 Aug 2025 13:40:11 +0200 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: Suresh Kumar Anaparti --- .../java/com/cloud/hypervisor/kvm/resource/VifDriverBase.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/VifDriverBase.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/VifDriverBase.java index 1ed811b05191..2ad2b8a6d4ce 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/VifDriverBase.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/VifDriverBase.java @@ -85,8 +85,6 @@ protected static int getNetworkRateKbps(NicTO nic) { if (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) { return nic.getNetworkRateMbps().intValue() * bitsPerMbpsToKbps; } - else { - return 0; - } + return 0; } }