From 234e0edfd72da840b759bcf5b6b65cb7b05952fd Mon Sep 17 00:00:00 2001 From: Peng Tao Date: Tue, 13 Aug 2019 01:58:51 -0700 Subject: [PATCH] qemu: fix memory prealloc handling Memory preallocation is just a property of different memory backends. We should treat it similar to memory sharing property. Also rename FileBackedMemShared to MemShared as it is just another memory backend property that works with different memory backends not just file backed memory. Signed-off-by: Peng Tao --- qemu/qemu.go | 70 +++++++++++++------------------- qemu/qemu_test.go | 101 +++++++++++++++++++++++++--------------------- 2 files changed, 84 insertions(+), 87 deletions(-) diff --git a/qemu/qemu.go b/qemu/qemu.go index e1394831e..4cb18d10a 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 577660d78..bc527ab6b 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) {