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 1ab63e1ba25..b4872231d36 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; + } + } + if (numCoresPerSocket > 0) { + cmd.setTopology(numCoresPerSocket, vcpus / numCoresPerSocket); + } + } }