From 5511f4e329bd1eb909ec8970a7f46b5210d35bb0 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Wed, 16 Jul 2025 11:58:01 +0530 Subject: [PATCH 1/2] kvm: implement Hyper-V enlightnements correctly This implements Hyper-V enlightenments as per the RHEL docs: https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/configuring_and_managing_windows_virtual_machines/optimizing-windows-virtual-machines#enabling-hyper-v-enlightenments This is enabled only when the guest OS is set to Windows PV. Signed-off-by: Rohit Yadav --- .../resource/LibvirtComputingResource.java | 14 +++++++++++- .../hypervisor/kvm/resource/LibvirtVMDef.java | 22 +++++++++++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 13518de5cb3c..e6760bd82e0c 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -2547,11 +2547,23 @@ protected void setQuotaAndPeriod(VirtualMachineTO vmTO, CpuTuneDef ctd) { protected void enlightenWindowsVm(VirtualMachineTO vmTO, FeaturesDef features) { if (vmTO.getOs().contains("Windows PV")) { // If OS is Windows PV, then enable the features. Features supported on Windows 2008 and later + // https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/10/html/configuring_and_managing_windows_virtual_machines/optimizing-windows-virtual-machines#enabling-hyper-v-enlightenments LibvirtVMDef.HyperVEnlightenmentFeatureDef hyv = new LibvirtVMDef.HyperVEnlightenmentFeatureDef(); hyv.setFeature("relaxed", true); hyv.setFeature("vapic", true); hyv.setFeature("spinlocks", true); - hyv.setRetries(8096); + hyv.setRetries(8191); + hyv.setFeature("vendor_id", true); + hyv.setFeature("vpindex", true); + hyv.setFeature("runtime", true); + hyv.setFeature("synic", true); + hyv.setFeature("frequencies", true); + hyv.setFeature("reset", true); + hyv.setFeature("tlbflush", true); + hyv.setFeature("reenlightenment", true); + hyv.setFeature("stimer", true); + hyv.setFeature("ipi", true); + hyv.setFeature("evmcs", true); features.addHyperVFeature(hyv); LOGGER.info("Enabling KVM Enlightment Features to VM domain " + vmTO.getUuid()); } diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java index 93ad084b4379..8e6f4ef0bf42 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java @@ -334,7 +334,18 @@ public static class HyperVEnlightenmentFeatureDef { enum Enlight { RELAX("relaxed"), VAPIC("vapic"), - SPIN("spinlocks"); + SPIN("spinlocks"), + VENDOR_ID("vendor_id"), + VPINDEX("vpindex"), + RUNTIME("runtime"), + SYNIC("synic"), + FREQ("frequencies"), + RESET("reset"), + TLBFLUSH("tlbflush"), + REENLIGHTEN("reenlightenment"), + STIMER("stimer"), + IPI("ipi"), + EVMCS("evmcs"); private final String featureName; Enlight(String featureName) { this.featureName = featureName; } @@ -379,10 +390,13 @@ public String toString() { feaBuilder.append("<"); feaBuilder.append(e.getKey()); - if(e.getKey().equals("spinlocks")) feaBuilder.append(" state='" + e.getValue() + "' retries='" + getRetries() + "'"); - else feaBuilder.append(" state='" + e.getValue() + "'"); + if(e.getKey().equals("spinlocks")) feaBuilder.append(" state='" + e.getValue() + "' retries='" + getRetries() + "'"); + else if(e.getKey().equals("vendor_id")) feaBuilder.append(" state='" + e.getValue() + "' value='KVM Hv'"); + else if(e.getKey().equals("stimer")) feaBuilder.append(" state='" + e.getValue() + "'>"); + else feaBuilder.append(" state='" + e.getValue() + "'"); - feaBuilder.append("/>\n"); + if(e.getKey().equals("stimer")) feaBuilder.append("\n"); + else feaBuilder.append("/>\n"); } feaBuilder.append("\n"); return feaBuilder.toString(); From f1510c63f4b81f3134474e900a4dbd8c9013704e Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Wed, 16 Jul 2025 12:01:44 +0530 Subject: [PATCH 2/2] fix space after `fi` Signed-off-by: Rohit Yadav --- .../cloud/hypervisor/kvm/resource/LibvirtVMDef.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java index 8e6f4ef0bf42..fb2321020268 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java @@ -390,12 +390,12 @@ public String toString() { feaBuilder.append("<"); feaBuilder.append(e.getKey()); - if(e.getKey().equals("spinlocks")) feaBuilder.append(" state='" + e.getValue() + "' retries='" + getRetries() + "'"); - else if(e.getKey().equals("vendor_id")) feaBuilder.append(" state='" + e.getValue() + "' value='KVM Hv'"); - else if(e.getKey().equals("stimer")) feaBuilder.append(" state='" + e.getValue() + "'>"); - else feaBuilder.append(" state='" + e.getValue() + "'"); + if (e.getKey().equals("spinlocks")) feaBuilder.append(" state='" + e.getValue() + "' retries='" + getRetries() + "'"); + else if (e.getKey().equals("vendor_id")) feaBuilder.append(" state='" + e.getValue() + "' value='KVM Hv'"); + else if (e.getKey().equals("stimer")) feaBuilder.append(" state='" + e.getValue() + "'>"); + else feaBuilder.append(" state='" + e.getValue() + "'"); - if(e.getKey().equals("stimer")) feaBuilder.append("\n"); + if (e.getKey().equals("stimer")) feaBuilder.append("\n"); else feaBuilder.append("/>\n"); } feaBuilder.append("\n");