qemu: Add maxcpus attribute to -smp

maxcpus is used to specify how many cpus a VM can have.
This attribute must be specified to enable the hotplugging CPUs capability,
otherwise the maximum number of CPU will be defined by the number of CPU
in -smp.

Signed-off-by: Julio Montes <julio.montes@intel.com>
This commit is contained in:
Julio Montes 2017-12-12 07:32:31 -06:00
parent eacde4d37d
commit 8fe572367a
2 changed files with 40 additions and 4 deletions

View File

@ -980,6 +980,10 @@ type SMP struct {
// Sockets is the number of sockets made available to qemu. // Sockets is the number of sockets made available to qemu.
Sockets uint32 Sockets uint32
// MaxCPUs is the maximum number of VCPUs that a VM can have.
// This value, if non-zero, MUST BE equal to or greater than CPUs
MaxCPUs uint32
} }
// Memory is the guest memory configuration structure. // Memory is the guest memory configuration structure.
@ -1203,7 +1207,7 @@ func (config *Config) appendMemory() {
} }
} }
func (config *Config) appendCPUs() { func (config *Config) appendCPUs() error {
if config.SMP.CPUs > 0 { if config.SMP.CPUs > 0 {
var SMPParams []string var SMPParams []string
@ -1221,9 +1225,19 @@ func (config *Config) appendCPUs() {
SMPParams = append(SMPParams, fmt.Sprintf(",sockets=%d", config.SMP.Sockets)) SMPParams = append(SMPParams, fmt.Sprintf(",sockets=%d", config.SMP.Sockets))
} }
if config.SMP.MaxCPUs > 0 {
if config.SMP.MaxCPUs < config.SMP.CPUs {
return fmt.Errorf("MaxCPUs %d must be equal to or greater than CPUs %d",
config.SMP.MaxCPUs, config.SMP.CPUs)
}
SMPParams = append(SMPParams, fmt.Sprintf(",maxcpus=%d", config.SMP.MaxCPUs))
}
config.qemuParams = append(config.qemuParams, "-smp") config.qemuParams = append(config.qemuParams, "-smp")
config.qemuParams = append(config.qemuParams, strings.Join(SMPParams, "")) config.qemuParams = append(config.qemuParams, strings.Join(SMPParams, ""))
} }
return nil
} }
func (config *Config) appendRTC() { func (config *Config) appendRTC() {
@ -1360,7 +1374,6 @@ func LaunchQemu(config Config, logger QMPLog) (string, error) {
config.appendCPUModel() config.appendCPUModel()
config.appendQMPSockets() config.appendQMPSockets()
config.appendMemory() config.appendMemory()
config.appendCPUs()
config.appendDevices() config.appendDevices()
config.appendRTC() config.appendRTC()
config.appendGlobalParam() config.appendGlobalParam()
@ -1369,6 +1382,10 @@ func LaunchQemu(config Config, logger QMPLog) (string, error) {
config.appendKernel() config.appendKernel()
config.appendBios() config.appendBios()
if err := config.appendCPUs(); err != nil {
return "", err
}
return LaunchCustomQemu(config.Ctx, config.Path, config.qemuParams, return LaunchCustomQemu(config.Ctx, config.Path, config.qemuParams,
config.fds, nil, logger) config.fds, nil, logger)
} }

View File

@ -52,7 +52,9 @@ func testAppend(structure interface{}, expected string, t *testing.T) {
case SMP: case SMP:
config.SMP = s config.SMP = s
config.appendCPUs() if err := config.appendCPUs(); err != nil {
t.Fatalf("Unexpected error: %v\n", err)
}
case QMPSocket: case QMPSocket:
config.QMPSockets = []QMPSocket{s} config.QMPSockets = []QMPSocket{s}
@ -356,7 +358,7 @@ func TestAppendMemory(t *testing.T) {
testAppend(memory, memoryString, t) testAppend(memory, memoryString, t)
} }
var cpusString = "-smp 2,cores=1,threads=2,sockets=2" var cpusString = "-smp 2,cores=1,threads=2,sockets=2,maxcpus=6"
func TestAppendCPUs(t *testing.T) { func TestAppendCPUs(t *testing.T) {
smp := SMP{ smp := SMP{
@ -364,11 +366,28 @@ func TestAppendCPUs(t *testing.T) {
Sockets: 2, Sockets: 2,
Cores: 1, Cores: 1,
Threads: 2, Threads: 2,
MaxCPUs: 6,
} }
testAppend(smp, cpusString, t) testAppend(smp, cpusString, t)
} }
func TestFailToAppendCPUs(t *testing.T) {
config := Config{
SMP: SMP{
CPUs: 2,
Sockets: 2,
Cores: 1,
Threads: 2,
MaxCPUs: 1,
},
}
if err := config.appendCPUs(); err == nil {
t.Fatalf("Expected appendCPUs to fail")
}
}
var qmpSingleSocketServerString = "-qmp unix:cc-qmp,server,nowait" var qmpSingleSocketServerString = "-qmp unix:cc-qmp,server,nowait"
var qmpSingleSocketString = "-qmp unix:cc-qmp" var qmpSingleSocketString = "-qmp unix:cc-qmp"