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..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 @@ -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();