Skip to content

Commit 5511f4e

Browse files
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 <[email protected]>
1 parent c61a5eb commit 5511f4e

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2547,11 +2547,23 @@ protected void setQuotaAndPeriod(VirtualMachineTO vmTO, CpuTuneDef ctd) {
25472547
protected void enlightenWindowsVm(VirtualMachineTO vmTO, FeaturesDef features) {
25482548
if (vmTO.getOs().contains("Windows PV")) {
25492549
// If OS is Windows PV, then enable the features. Features supported on Windows 2008 and later
2550+
// 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
25502551
LibvirtVMDef.HyperVEnlightenmentFeatureDef hyv = new LibvirtVMDef.HyperVEnlightenmentFeatureDef();
25512552
hyv.setFeature("relaxed", true);
25522553
hyv.setFeature("vapic", true);
25532554
hyv.setFeature("spinlocks", true);
2554-
hyv.setRetries(8096);
2555+
hyv.setRetries(8191);
2556+
hyv.setFeature("vendor_id", true);
2557+
hyv.setFeature("vpindex", true);
2558+
hyv.setFeature("runtime", true);
2559+
hyv.setFeature("synic", true);
2560+
hyv.setFeature("frequencies", true);
2561+
hyv.setFeature("reset", true);
2562+
hyv.setFeature("tlbflush", true);
2563+
hyv.setFeature("reenlightenment", true);
2564+
hyv.setFeature("stimer", true);
2565+
hyv.setFeature("ipi", true);
2566+
hyv.setFeature("evmcs", true);
25552567
features.addHyperVFeature(hyv);
25562568
LOGGER.info("Enabling KVM Enlightment Features to VM domain " + vmTO.getUuid());
25572569
}

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,18 @@ public static class HyperVEnlightenmentFeatureDef {
334334
enum Enlight {
335335
RELAX("relaxed"),
336336
VAPIC("vapic"),
337-
SPIN("spinlocks");
337+
SPIN("spinlocks"),
338+
VENDOR_ID("vendor_id"),
339+
VPINDEX("vpindex"),
340+
RUNTIME("runtime"),
341+
SYNIC("synic"),
342+
FREQ("frequencies"),
343+
RESET("reset"),
344+
TLBFLUSH("tlbflush"),
345+
REENLIGHTEN("reenlightenment"),
346+
STIMER("stimer"),
347+
IPI("ipi"),
348+
EVMCS("evmcs");
338349

339350
private final String featureName;
340351
Enlight(String featureName) { this.featureName = featureName; }
@@ -379,10 +390,13 @@ public String toString() {
379390
feaBuilder.append("<");
380391
feaBuilder.append(e.getKey());
381392

382-
if(e.getKey().equals("spinlocks")) feaBuilder.append(" state='" + e.getValue() + "' retries='" + getRetries() + "'");
383-
else feaBuilder.append(" state='" + e.getValue() + "'");
393+
if(e.getKey().equals("spinlocks")) feaBuilder.append(" state='" + e.getValue() + "' retries='" + getRetries() + "'");
394+
else if(e.getKey().equals("vendor_id")) feaBuilder.append(" state='" + e.getValue() + "' value='KVM Hv'");
395+
else if(e.getKey().equals("stimer")) feaBuilder.append(" state='" + e.getValue() + "'><direct state='" + e.getValue() + "'/>");
396+
else feaBuilder.append(" state='" + e.getValue() + "'");
384397

385-
feaBuilder.append("/>\n");
398+
if(e.getKey().equals("stimer")) feaBuilder.append("</stimer>\n");
399+
else feaBuilder.append("/>\n");
386400
}
387401
feaBuilder.append("</hyperv>\n");
388402
return feaBuilder.toString();

0 commit comments

Comments
 (0)