From d078130e753a0dffef6f1953974b1750e3a406f5 Mon Sep 17 00:00:00 2001 From: Simon Weller Date: Mon, 1 Oct 2018 17:27:33 -0500 Subject: [PATCH 1/5] KVM HyperV Enlightment Feature Completion --- .../resource/LibvirtComputingResource.java | 21 +++++++++++-------- .../hypervisor/kvm/resource/LibvirtVMDef.java | 2 ++ 2 files changed, 14 insertions(+), 9 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 ed87974cd51a..5be0f067f995 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 @@ -2101,14 +2101,17 @@ So if getMinSpeed() returns null we fall back to getSpeed(). features.addFeatures("pae"); features.addFeatures("apic"); features.addFeatures("acpi"); - //for rhel 6.5 and above, hyperv enlightment feature is added - /* - * if (vmTO.getOs().contains("Windows Server 2008") && hostOsVersion != null && ((hostOsVersion.first() == 6 && hostOsVersion.second() >= 5) || (hostOsVersion.first() >= 7))) { - * LibvirtVMDef.HyperVEnlightenmentFeatureDef hyv = new LibvirtVMDef.HyperVEnlightenmentFeatureDef(); - * hyv.setRelaxed(true); - * features.addHyperVFeature(hyv); - * } - */ + //for rhel 6.5 and above, hyperv enlightenment feature is added + + if (vmTO.getOs().contains("Windows PV")) { + LibvirtVMDef.HyperVEnlightenmentFeatureDef hyv = new LibvirtVMDef.HyperVEnlightenmentFeatureDef(); + hyv.setFeature("relaxed", true); + hyv.setFeature("vapic", true); + hyv.setFeature("spinlocks", true); + hyv.setRetries(8096); + features.addHyperVFeature(hyv); + } + vm.addComp(features); final TermPolicy term = new TermPolicy(); @@ -2120,7 +2123,7 @@ So if getMinSpeed() returns null we fall back to getSpeed(). final ClockDef clock = new ClockDef(); if (vmTO.getOs().startsWith("Windows")) { clock.setClockOffset(ClockDef.ClockOffset.LOCALTIME); - clock.setTimer("rtc", "catchup", null); + clock.setTimer("hypervclock", null, null); } else if (vmTO.getType() != VirtualMachine.Type.User || isGuestPVEnabled(vmTO.getOs())) { if (_hypervisorLibvirtVersion >= 9 * 1000 + 10) { clock.setTimer("kvmclock", null, null, _noKvmClock); 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 08ece9a104ed..1e49cb58e780 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 @@ -370,6 +370,8 @@ public String toString() { if (_timerName.equals("kvmclock") && _noKvmClock) { clockBuilder.append("present='no' />"); + } else if (_timerName.equals("hypervclock")) { + clockBuilder.append("present='yes' />"); } else { if (_tickPolicy != null) { clockBuilder.append("tickpolicy='"); From 890db0f2c44b6a74376afc483a364bd888bafe98 Mon Sep 17 00:00:00 2001 From: Simon Weller Date: Fri, 19 Oct 2018 12:26:49 -0500 Subject: [PATCH 2/5] Move enlightenment to method --- .../resource/LibvirtComputingResource.java | 24 ++++++++++++------- .../kvm/resource/LibvirtVMDefTest.java | 6 +---- 2 files changed, 16 insertions(+), 14 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 5be0f067f995..c400f90073b6 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 @@ -2016,6 +2016,19 @@ protected void setQuotaAndPeriod(VirtualMachineTO vmTO, CpuTuneDef ctd) { } } + protected void enlightenWindowsVm(VirtualMachineTO vmTO, FeaturesDef features) { + // If OS is Windows PV, then enable the features. Features supported on Windows 2008 and later + if (vmTO.getOs().contains("Windows PV")) { + LibvirtVMDef.HyperVEnlightenmentFeatureDef hyv = new LibvirtVMDef.HyperVEnlightenmentFeatureDef(); + hyv.setFeature("relaxed", true); + hyv.setFeature("vapic", true); + hyv.setFeature("spinlocks", true); + hyv.setRetries(8096); + features.addHyperVFeature(hyv); + s_logger.info("Enabling KVM Enlightment Features to VM domain " + vmTO.getUuid()); + } + } + public LibvirtVMDef createVMFromSpec(final VirtualMachineTO vmTO) { final LibvirtVMDef vm = new LibvirtVMDef(); vm.setDomainName(vmTO.getName()); @@ -2101,16 +2114,9 @@ So if getMinSpeed() returns null we fall back to getSpeed(). features.addFeatures("pae"); features.addFeatures("apic"); features.addFeatures("acpi"); - //for rhel 6.5 and above, hyperv enlightenment feature is added - if (vmTO.getOs().contains("Windows PV")) { - LibvirtVMDef.HyperVEnlightenmentFeatureDef hyv = new LibvirtVMDef.HyperVEnlightenmentFeatureDef(); - hyv.setFeature("relaxed", true); - hyv.setFeature("vapic", true); - hyv.setFeature("spinlocks", true); - hyv.setRetries(8096); - features.addHyperVFeature(hyv); - } + //KVM hyperv enlightenment features based on OS Type + enlightenWindowsVm(vmTO, features); vm.addComp(features); diff --git a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java index b391b94e7406..0b8ae490d74f 100644 --- a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java +++ b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java @@ -155,12 +155,8 @@ public void testHypervEnlightDef() { assertFalse(defs.contains("relaxed")); assertFalse(defs.contains("vapic")); assertFalse(defs.contains("spinlocks")); - assertTrue("Windows Server 2008 R2".contains("Windows Server 2008")); + assertTrue("Windows PV".contains("Windows PV")); - Pair hostOsVersion = new Pair(6,5); - assertTrue((hostOsVersion.first() == 6 && hostOsVersion.second() >= 5) || (hostOsVersion.first() >= 7)); - hostOsVersion = new Pair(7,1); - assertTrue((hostOsVersion.first() == 6 && hostOsVersion.second() >= 5) || (hostOsVersion.first() >= 7)); } public void testRngDef() { From 44cebb151a2b9ab090bba6304f9bd02b9dee49b3 Mon Sep 17 00:00:00 2001 From: Simon Weller Date: Fri, 19 Oct 2018 13:17:34 -0500 Subject: [PATCH 3/5] Check style indent fix --- .../cloud/hypervisor/kvm/resource/LibvirtComputingResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c400f90073b6..5ab8ab674fab 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 @@ -2017,7 +2017,7 @@ protected void setQuotaAndPeriod(VirtualMachineTO vmTO, CpuTuneDef ctd) { } protected void enlightenWindowsVm(VirtualMachineTO vmTO, FeaturesDef features) { - // If OS is Windows PV, then enable the features. Features supported on Windows 2008 and later + // If OS is Windows PV, then enable the features. Features supported on Windows 2008 and later if (vmTO.getOs().contains("Windows PV")) { LibvirtVMDef.HyperVEnlightenmentFeatureDef hyv = new LibvirtVMDef.HyperVEnlightenmentFeatureDef(); hyv.setFeature("relaxed", true); From b1588312e8b8c65ffea7fb8aaf1bb0c8abd1957b Mon Sep 17 00:00:00 2001 From: Simon Weller Date: Fri, 19 Oct 2018 13:44:21 -0500 Subject: [PATCH 4/5] Check style indent fix --- .../cloud/hypervisor/kvm/resource/LibvirtComputingResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5ab8ab674fab..f9dc1922e33f 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 @@ -2017,8 +2017,8 @@ protected void setQuotaAndPeriod(VirtualMachineTO vmTO, CpuTuneDef ctd) { } protected void enlightenWindowsVm(VirtualMachineTO vmTO, FeaturesDef features) { - // If OS is Windows PV, then enable the features. Features supported on Windows 2008 and later if (vmTO.getOs().contains("Windows PV")) { + // If OS is Windows PV, then enable the features. Features supported on Windows 2008 and later LibvirtVMDef.HyperVEnlightenmentFeatureDef hyv = new LibvirtVMDef.HyperVEnlightenmentFeatureDef(); hyv.setFeature("relaxed", true); hyv.setFeature("vapic", true); From 132e04fcd756b13d7b87bd5ab5301123fa95da4a Mon Sep 17 00:00:00 2001 From: Simon Weller Date: Fri, 19 Oct 2018 15:09:27 -0500 Subject: [PATCH 5/5] Remove unused import --- .../java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java index 0b8ae490d74f..32effb474d88 100644 --- a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java +++ b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java @@ -26,7 +26,6 @@ import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ChannelDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.SCSIDef; -import com.cloud.utils.Pair; public class LibvirtVMDefTest extends TestCase {