diff --git a/src/runtime/pkg/katautils/config.go b/src/runtime/pkg/katautils/config.go index 93a870e8a0..f34133cb89 100644 --- a/src/runtime/pkg/katautils/config.go +++ b/src/runtime/pkg/katautils/config.go @@ -307,11 +307,24 @@ func (h hypervisor) GetEntropySource() string { return h.EntropySource } +// Current cpu number should not larger than defaultMaxVCPUs() +func getCurrentCpuNum() uint32 { + var cpu uint32 + h := hypervisor{} + + cpu = uint32(goruntime.NumCPU()) + if cpu > h.defaultMaxVCPUs() { + cpu = h.defaultMaxVCPUs() + } + + return cpu +} + func (h hypervisor) defaultVCPUs() uint32 { - numCPUs := goruntime.NumCPU() + numCPUs := getCurrentCpuNum() if h.NumVCPUs < 0 || h.NumVCPUs > int32(numCPUs) { - return uint32(numCPUs) + return numCPUs } if h.NumVCPUs == 0 { // or unspecified return defaultVCPUCount diff --git a/src/runtime/pkg/katautils/config_test.go b/src/runtime/pkg/katautils/config_test.go index a3f93d694d..11c3eaf287 100644 --- a/src/runtime/pkg/katautils/config_test.go +++ b/src/runtime/pkg/katautils/config_test.go @@ -14,7 +14,6 @@ import ( "path" "path/filepath" "reflect" - goruntime "runtime" "strings" "syscall" "testing" @@ -156,7 +155,7 @@ func createAllRuntimeConfigFiles(dir, hypervisor string) (config testRuntimeConf KernelParams: vc.DeserializeParams(strings.Fields(kernelParams)), HypervisorMachineType: machineType, NumVCPUs: defaultVCPUCount, - DefaultMaxVCPUs: uint32(goruntime.NumCPU()), + DefaultMaxVCPUs: getCurrentCpuNum(), MemorySize: defaultMemSize, DisableBlockDeviceUse: disableBlockDevice, BlockDeviceDriver: defaultBlockDeviceDriver, @@ -919,13 +918,13 @@ func TestNewClhHypervisorConfig(t *testing.T) { func TestHypervisorDefaults(t *testing.T) { assert := assert.New(t) - numCPUs := goruntime.NumCPU() + numCPUs := getCurrentCpuNum() h := hypervisor{} assert.Equal(h.machineType(), defaultMachineType, "default hypervisor machine type wrong") assert.Equal(h.defaultVCPUs(), defaultVCPUCount, "default vCPU number is wrong") - assert.Equal(h.defaultMaxVCPUs(), uint32(numCPUs), "default max vCPU number is wrong") + assert.Equal(h.defaultMaxVCPUs(), numCPUs, "default max vCPU number is wrong") assert.Equal(h.defaultMemSz(), defaultMemSize, "default memory size is wrong") machineType := "foo" @@ -934,23 +933,23 @@ func TestHypervisorDefaults(t *testing.T) { // auto inferring h.NumVCPUs = -1 - assert.Equal(h.defaultVCPUs(), uint32(numCPUs), "default vCPU number is wrong") + assert.Equal(h.defaultVCPUs(), numCPUs, "default vCPU number is wrong") h.NumVCPUs = 2 assert.Equal(h.defaultVCPUs(), uint32(2), "default vCPU number is wrong") h.NumVCPUs = int32(numCPUs) + 1 - assert.Equal(h.defaultVCPUs(), uint32(numCPUs), "default vCPU number is wrong") + assert.Equal(h.defaultVCPUs(), numCPUs, "default vCPU number is wrong") h.DefaultMaxVCPUs = 2 assert.Equal(h.defaultMaxVCPUs(), uint32(2), "default max vCPU number is wrong") - h.DefaultMaxVCPUs = uint32(numCPUs) + 1 - assert.Equal(h.defaultMaxVCPUs(), uint32(numCPUs), "default max vCPU number is wrong") + h.DefaultMaxVCPUs = numCPUs + 1 + assert.Equal(h.defaultMaxVCPUs(), numCPUs, "default max vCPU number is wrong") maxvcpus := vc.MaxQemuVCPUs() h.DefaultMaxVCPUs = maxvcpus + 1 - assert.Equal(h.defaultMaxVCPUs(), uint32(numCPUs), "default max vCPU number is wrong") + assert.Equal(h.defaultMaxVCPUs(), numCPUs, "default max vCPU number is wrong") h.MemorySize = 1024 assert.Equal(h.defaultMemSz(), uint32(1024), "default memory size is wrong")