diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java index fb1b1340115c..7310f1253bb6 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java @@ -191,22 +191,57 @@ public String toString() { } public static class HyperVEnlightenmentFeatureDef { - private final Map features = new HashMap(); - public void setRelaxed(boolean on) { - String state = on ? "On":"Off"; - features.put("relaxed", state); + enum Enlight { + RELAX("relaxed"), + VAPIC("vapic"), + SPIN("spinlocks"); + + private final String featureName; + Enlight(String featureName) { this.featureName = featureName; } + String getFeatureName() { return featureName; } + + static boolean isValidFeature(String featureName) { + Enlight[] enlights = Enlight.values(); + for(Enlight e : enlights) { + if(e.getFeatureName().equals(featureName)) + return true; + } + return false; + } + } + + private final Map features = new HashMap(); + private int retries = 4096; // set to sane default + + public void setFeature(String feature, boolean on) { + if(on && Enlight.isValidFeature(feature)) + setFeature(feature); + } + + private void setFeature(String feature) { + features.put(feature, "on"); } + + public void setRetries(int retry) { + if(retry>=retries) + retries=retry; + } + + public int getRetries() { + return retries; + } + @Override public String toString() { - if (features.isEmpty()) { - return ""; - } StringBuilder feaBuilder = new StringBuilder(); feaBuilder.append("\n"); for (Map.Entry e : features.entrySet()) { feaBuilder.append("<"); feaBuilder.append(e.getKey()); - feaBuilder.append(" state='" + e.getValue() + "'"); + + if(e.getKey().equals("spinlocks")) feaBuilder.append(" state='" + e.getValue() + "' retries='" + getRetries() + "'"); + else feaBuilder.append(" state='" + e.getValue() + "'"); + feaBuilder.append("/>\n"); } feaBuilder.append("\n"); diff --git a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java index 856a8a58bae8..a9261291a028 100644 --- a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java +++ b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java @@ -94,16 +94,22 @@ public void testDiskDef() { public void testHypervEnlightDef() { LibvirtVMDef.FeaturesDef featuresDef = new LibvirtVMDef.FeaturesDef(); LibvirtVMDef.HyperVEnlightenmentFeatureDef hyperVEnlightenmentFeatureDef = new LibvirtVMDef.HyperVEnlightenmentFeatureDef(); - hyperVEnlightenmentFeatureDef.setRelaxed(true); + hyperVEnlightenmentFeatureDef.setFeature("relaxed", true); + hyperVEnlightenmentFeatureDef.setFeature("vapic", true); + hyperVEnlightenmentFeatureDef.setFeature("spinlocks", true); + hyperVEnlightenmentFeatureDef.setRetries(8096); featuresDef.addHyperVFeature(hyperVEnlightenmentFeatureDef); String defs = featuresDef.toString(); assertTrue(defs.contains("relaxed")); + assertTrue(defs.contains("vapic")); + assertTrue(defs.contains("spinlocks")); featuresDef = new LibvirtVMDef.FeaturesDef(); featuresDef.addFeatures("pae"); defs = featuresDef.toString(); assertFalse(defs.contains("relaxed")); - + assertFalse(defs.contains("vapic")); + assertFalse(defs.contains("spinlocks")); assertTrue("Windows Server 2008 R2".contains("Windows Server 2008")); Pair hostOsVersion = new Pair(6,5);