From 93f3d352071be326ab3b810e23da7c27a948aedd Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Wed, 9 Dec 2020 15:07:51 +0100 Subject: [PATCH] kvm: FIX cpucorespersocket is not working on KVM (#4497) --- .../resource/LibvirtComputingResource.java | 31 ++++++++++++++----- .../java/com/cloud/vm/UserVmManagerImpl.java | 9 ++++++ 2 files changed, 32 insertions(+), 8 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 fd95a8ccbe8..c4388330324 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 @@ -2302,14 +2302,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv if (vmTO.getType() == VirtualMachine.Type.User) { cmd.setFeatures(_cpuFeatures); } - // multi cores per socket, for larger core configs - if (vcpus % 6 == 0) { - final int sockets = vcpus / 6; - cmd.setTopology(6, sockets); - } else if (vcpus % 4 == 0) { - final int sockets = vcpus / 4; - cmd.setTopology(4, sockets); - } + setCpuTopology(cmd, vcpus, vmTO.getDetails()); vm.addComp(cmd); } @@ -4230,4 +4223,26 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return false; } + + private void setCpuTopology(CpuModeDef cmd, int vcpus, Map details) { + // multi cores per socket, for larger core configs + int numCoresPerSocket = -1; + if (details != null) { + final String coresPerSocket = details.get(VmDetailConstants.CPU_CORE_PER_SOCKET); + final int intCoresPerSocket = NumbersUtil.parseInt(coresPerSocket, numCoresPerSocket); + if (intCoresPerSocket > 0 && vcpus % intCoresPerSocket == 0) { + numCoresPerSocket = intCoresPerSocket; + } + } + if (numCoresPerSocket <= 0) { + if (vcpus % 6 == 0) { + numCoresPerSocket = 6; + } else if (vcpus % 4 == 0) { + numCoresPerSocket = 4; + } else { + numCoresPerSocket = 1; + } + } + cmd.setTopology(numCoresPerSocket, vcpus / numCoresPerSocket); + } } diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 192a027512a..fe8d8a45bcb 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -2478,6 +2478,15 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir if (ovfPropertyVO != null && ovfPropertyVO.isPassword()) { details.put(detailName, DBEncryptionUtil.encrypt(details.get(detailName))); } + } else if (VmDetailConstants.CPU_CORE_PER_SOCKET.equals(detailName)) { + try { + final int val = Integer.parseInt(details.get(detailName)); + if (val <= 0) { + throw new InvalidParameterValueException("Please enter a positive integer value for the vm setting: " + detailName); + } + } catch (final NumberFormatException e) { + throw new InvalidParameterValueException("Please enter an integer value for vm setting: " + detailName); + } } } vmInstance.setDetails(details);