diff --git a/qemu/qemu.go b/qemu/qemu.go index e1394831e6..4cb18d10ad 100644 --- a/qemu/qemu.go +++ b/qemu/qemu.go @@ -1456,8 +1456,8 @@ type Knobs struct { // be set. FileBackedMem bool - // FileBackedMemShared will set the FileBackedMem device as shared. - FileBackedMemShared bool + // MemShared will set the memory device as shared. + MemShared bool // Mlock will control locking of memory // Only active when Realtime is set to true @@ -1758,46 +1758,34 @@ func (config *Config) appendKernel() { } func (config *Config) appendMemoryKnobs() { - if config.Knobs.HugePages { - if config.Memory.Size != "" { - dimmName := "dimm1" - objMemParam := "memory-backend-file,id=" + dimmName + ",size=" + config.Memory.Size + ",mem-path=/dev/hugepages,share=on,prealloc=on" - numaMemParam := "node,memdev=" + dimmName - - config.qemuParams = append(config.qemuParams, "-object") - config.qemuParams = append(config.qemuParams, objMemParam) - - config.qemuParams = append(config.qemuParams, "-numa") - config.qemuParams = append(config.qemuParams, numaMemParam) - } - } else if config.Knobs.MemPrealloc { - if config.Memory.Size != "" { - dimmName := "dimm1" - objMemParam := "memory-backend-ram,id=" + dimmName + ",size=" + config.Memory.Size + ",prealloc=on" - numaMemParam := "node,memdev=" + dimmName - - config.qemuParams = append(config.qemuParams, "-object") - config.qemuParams = append(config.qemuParams, objMemParam) - - config.qemuParams = append(config.qemuParams, "-numa") - config.qemuParams = append(config.qemuParams, numaMemParam) - } - } else if config.Knobs.FileBackedMem { - if config.Memory.Size != "" && config.Memory.Path != "" { - dimmName := "dimm1" - objMemParam := "memory-backend-file,id=" + dimmName + ",size=" + config.Memory.Size + ",mem-path=" + config.Memory.Path - if config.Knobs.FileBackedMemShared { - objMemParam += ",share=on" - } - numaMemParam := "node,memdev=" + dimmName - - config.qemuParams = append(config.qemuParams, "-object") - config.qemuParams = append(config.qemuParams, objMemParam) - - config.qemuParams = append(config.qemuParams, "-numa") - config.qemuParams = append(config.qemuParams, numaMemParam) - } + if config.Memory.Size == "" { + return } + + var objMemParam, numaMemParam string + dimmName := "dimm1" + if config.Knobs.HugePages { + objMemParam = "memory-backend-file,id=" + dimmName + ",size=" + config.Memory.Size + ",mem-path=/dev/hugepages" + numaMemParam = "node,memdev=" + dimmName + } else if config.Knobs.FileBackedMem && config.Memory.Path != "" { + objMemParam = "memory-backend-file,id=" + dimmName + ",size=" + config.Memory.Size + ",mem-path=" + config.Memory.Path + numaMemParam = "node,memdev=" + dimmName + } else { + objMemParam = "memory-backend-ram,id=" + dimmName + ",size=" + config.Memory.Size + numaMemParam = "node,memdev=" + dimmName + } + + if config.Knobs.MemShared { + objMemParam += ",share=on" + } + if config.Knobs.MemPrealloc { + objMemParam += ",prealloc=on" + } + config.qemuParams = append(config.qemuParams, "-object") + config.qemuParams = append(config.qemuParams, objMemParam) + + config.qemuParams = append(config.qemuParams, "-numa") + config.qemuParams = append(config.qemuParams, numaMemParam) } func (config *Config) appendKnobs() { diff --git a/qemu/qemu_test.go b/qemu/qemu_test.go index 577660d783..bc527ab6bc 100644 --- a/qemu/qemu_test.go +++ b/qemu/qemu_test.go @@ -488,16 +488,16 @@ func TestAppendEmptyDevice(t *testing.T) { func TestAppendKnobsAllTrue(t *testing.T) { var knobsString = "-no-user-config -nodefaults -nographic -daemonize -realtime mlock=on -S" knobs := Knobs{ - NoUserConfig: true, - NoDefaults: true, - NoGraphic: true, - Daemonize: true, - MemPrealloc: true, - FileBackedMem: true, - FileBackedMemShared: true, - Realtime: true, - Mlock: true, - Stopped: true, + NoUserConfig: true, + NoDefaults: true, + NoGraphic: true, + Daemonize: true, + MemPrealloc: true, + FileBackedMem: true, + MemShared: true, + Realtime: true, + Mlock: true, + Stopped: true, } testAppend(knobs, knobsString, t) @@ -506,15 +506,15 @@ func TestAppendKnobsAllTrue(t *testing.T) { func TestAppendKnobsAllFalse(t *testing.T) { var knobsString = "-realtime mlock=off" knobs := Knobs{ - NoUserConfig: false, - NoDefaults: false, - NoGraphic: false, - MemPrealloc: false, - FileBackedMem: false, - FileBackedMemShared: false, - Realtime: false, - Mlock: false, - Stopped: false, + NoUserConfig: false, + NoDefaults: false, + NoGraphic: false, + MemPrealloc: false, + FileBackedMem: false, + MemShared: false, + Realtime: false, + Mlock: false, + Stopped: false, } testAppend(knobs, knobsString, t) @@ -533,10 +533,10 @@ func TestAppendMemoryHugePages(t *testing.T) { testConfigAppend(conf, conf.Memory, memString, t) knobs := Knobs{ - HugePages: true, - MemPrealloc: true, - FileBackedMem: true, - FileBackedMemShared: true, + HugePages: true, + MemPrealloc: true, + FileBackedMem: true, + MemShared: true, } knobsString := "-object memory-backend-file,id=dimm1,size=1G,mem-path=/dev/hugepages,share=on,prealloc=on -numa node,memdev=dimm1" mlockFalseString := "-realtime mlock=off" @@ -557,17 +557,16 @@ func TestAppendMemoryMemPrealloc(t *testing.T) { testConfigAppend(conf, conf.Memory, memString, t) knobs := Knobs{ - MemPrealloc: true, - FileBackedMem: true, - FileBackedMemShared: true, + MemPrealloc: true, + MemShared: true, } - knobsString := "-object memory-backend-ram,id=dimm1,size=1G,prealloc=on -numa node,memdev=dimm1" + knobsString := "-object memory-backend-ram,id=dimm1,size=1G,share=on,prealloc=on -numa node,memdev=dimm1" mlockFalseString := "-realtime mlock=off" testConfigAppend(conf, knobs, memString+" "+knobsString+" "+mlockFalseString, t) } -func TestAppendMemoryFileBackedMemShared(t *testing.T) { +func TestAppendMemoryMemShared(t *testing.T) { conf := &Config{ Memory: Memory{ Size: "1G", @@ -580,8 +579,8 @@ func TestAppendMemoryFileBackedMemShared(t *testing.T) { testConfigAppend(conf, conf.Memory, memString, t) knobs := Knobs{ - FileBackedMem: true, - FileBackedMemShared: true, + FileBackedMem: true, + MemShared: true, } knobsString := "-object memory-backend-file,id=dimm1,size=1G,mem-path=foobar,share=on -numa node,memdev=dimm1" mlockFalseString := "-realtime mlock=off" @@ -602,8 +601,8 @@ func TestAppendMemoryFileBackedMem(t *testing.T) { testConfigAppend(conf, conf.Memory, memString, t) knobs := Knobs{ - FileBackedMem: true, - FileBackedMemShared: false, + FileBackedMem: true, + MemShared: false, } knobsString := "-object memory-backend-file,id=dimm1,size=1G,mem-path=foobar -numa node,memdev=dimm1" mlockFalseString := "-realtime mlock=off" @@ -611,6 +610,29 @@ func TestAppendMemoryFileBackedMem(t *testing.T) { testConfigAppend(conf, knobs, memString+" "+knobsString+" "+mlockFalseString, t) } +func TestAppendMemoryFileBackedMemPrealloc(t *testing.T) { + conf := &Config{ + Memory: Memory{ + Size: "1G", + Slots: 8, + MaxMem: "3G", + Path: "foobar", + }, + } + memString := "-m 1G,slots=8,maxmem=3G" + testConfigAppend(conf, conf.Memory, memString, t) + + knobs := Knobs{ + FileBackedMem: true, + MemShared: true, + MemPrealloc: true, + } + knobsString := "-object memory-backend-file,id=dimm1,size=1G,mem-path=foobar,share=on,prealloc=on -numa node,memdev=dimm1" + mlockFalseString := "-realtime mlock=off" + + testConfigAppend(conf, knobs, memString+" "+knobsString+" "+mlockFalseString, t) +} + var kernelString = "-kernel /opt/vmlinux.container -initrd /opt/initrd.container -append root=/dev/pmem0p1 rootflags=dax,data=ordered,errors=remount-ro rw rootfstype=ext4 tsc=reliable" func TestAppendKernel(t *testing.T) { @@ -987,7 +1009,7 @@ func TestBadMemoryKnobs(t *testing.T) { c = &Config{ Knobs: Knobs{ - HugePages: true, + MemShared: true, }, } c.appendMemoryKnobs() @@ -1004,19 +1026,6 @@ func TestBadMemoryKnobs(t *testing.T) { if len(c.qemuParams) != 0 { t.Errorf("Expected empty qemuParams, found %s", c.qemuParams) } - - c = &Config{ - Knobs: Knobs{ - FileBackedMem: true, - }, - Memory: Memory{ - Size: "1024", - }, - } - c.appendMemoryKnobs() - if len(c.qemuParams) != 0 { - t.Errorf("Expected empty qemuParams, found %s", c.qemuParams) - } } func TestBadKnobs(t *testing.T) {