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 <bergwolf@hyper.sh>
This commit is contained in:
Peng Tao 2019-08-13 01:58:51 -07:00
parent 30bfcaaa6d
commit 234e0edfd7
2 changed files with 84 additions and 87 deletions

View File

@ -1456,8 +1456,8 @@ type Knobs struct {
// be set. // be set.
FileBackedMem bool FileBackedMem bool
// FileBackedMemShared will set the FileBackedMem device as shared. // MemShared will set the memory device as shared.
FileBackedMemShared bool MemShared bool
// Mlock will control locking of memory // Mlock will control locking of memory
// Only active when Realtime is set to true // Only active when Realtime is set to true
@ -1758,46 +1758,34 @@ func (config *Config) appendKernel() {
} }
func (config *Config) appendMemoryKnobs() { func (config *Config) appendMemoryKnobs() {
if config.Knobs.HugePages { if config.Memory.Size == "" {
if config.Memory.Size != "" { return
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)
}
} }
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() { func (config *Config) appendKnobs() {

View File

@ -488,16 +488,16 @@ func TestAppendEmptyDevice(t *testing.T) {
func TestAppendKnobsAllTrue(t *testing.T) { func TestAppendKnobsAllTrue(t *testing.T) {
var knobsString = "-no-user-config -nodefaults -nographic -daemonize -realtime mlock=on -S" var knobsString = "-no-user-config -nodefaults -nographic -daemonize -realtime mlock=on -S"
knobs := Knobs{ knobs := Knobs{
NoUserConfig: true, NoUserConfig: true,
NoDefaults: true, NoDefaults: true,
NoGraphic: true, NoGraphic: true,
Daemonize: true, Daemonize: true,
MemPrealloc: true, MemPrealloc: true,
FileBackedMem: true, FileBackedMem: true,
FileBackedMemShared: true, MemShared: true,
Realtime: true, Realtime: true,
Mlock: true, Mlock: true,
Stopped: true, Stopped: true,
} }
testAppend(knobs, knobsString, t) testAppend(knobs, knobsString, t)
@ -506,15 +506,15 @@ func TestAppendKnobsAllTrue(t *testing.T) {
func TestAppendKnobsAllFalse(t *testing.T) { func TestAppendKnobsAllFalse(t *testing.T) {
var knobsString = "-realtime mlock=off" var knobsString = "-realtime mlock=off"
knobs := Knobs{ knobs := Knobs{
NoUserConfig: false, NoUserConfig: false,
NoDefaults: false, NoDefaults: false,
NoGraphic: false, NoGraphic: false,
MemPrealloc: false, MemPrealloc: false,
FileBackedMem: false, FileBackedMem: false,
FileBackedMemShared: false, MemShared: false,
Realtime: false, Realtime: false,
Mlock: false, Mlock: false,
Stopped: false, Stopped: false,
} }
testAppend(knobs, knobsString, t) testAppend(knobs, knobsString, t)
@ -533,10 +533,10 @@ func TestAppendMemoryHugePages(t *testing.T) {
testConfigAppend(conf, conf.Memory, memString, t) testConfigAppend(conf, conf.Memory, memString, t)
knobs := Knobs{ knobs := Knobs{
HugePages: true, HugePages: true,
MemPrealloc: true, MemPrealloc: true,
FileBackedMem: true, FileBackedMem: true,
FileBackedMemShared: true, MemShared: true,
} }
knobsString := "-object memory-backend-file,id=dimm1,size=1G,mem-path=/dev/hugepages,share=on,prealloc=on -numa node,memdev=dimm1" 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" mlockFalseString := "-realtime mlock=off"
@ -557,17 +557,16 @@ func TestAppendMemoryMemPrealloc(t *testing.T) {
testConfigAppend(conf, conf.Memory, memString, t) testConfigAppend(conf, conf.Memory, memString, t)
knobs := Knobs{ knobs := Knobs{
MemPrealloc: true, MemPrealloc: true,
FileBackedMem: true, MemShared: true,
FileBackedMemShared: 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" mlockFalseString := "-realtime mlock=off"
testConfigAppend(conf, knobs, memString+" "+knobsString+" "+mlockFalseString, t) testConfigAppend(conf, knobs, memString+" "+knobsString+" "+mlockFalseString, t)
} }
func TestAppendMemoryFileBackedMemShared(t *testing.T) { func TestAppendMemoryMemShared(t *testing.T) {
conf := &Config{ conf := &Config{
Memory: Memory{ Memory: Memory{
Size: "1G", Size: "1G",
@ -580,8 +579,8 @@ func TestAppendMemoryFileBackedMemShared(t *testing.T) {
testConfigAppend(conf, conf.Memory, memString, t) testConfigAppend(conf, conf.Memory, memString, t)
knobs := Knobs{ knobs := Knobs{
FileBackedMem: true, FileBackedMem: true,
FileBackedMemShared: true, MemShared: true,
} }
knobsString := "-object memory-backend-file,id=dimm1,size=1G,mem-path=foobar,share=on -numa node,memdev=dimm1" knobsString := "-object memory-backend-file,id=dimm1,size=1G,mem-path=foobar,share=on -numa node,memdev=dimm1"
mlockFalseString := "-realtime mlock=off" mlockFalseString := "-realtime mlock=off"
@ -602,8 +601,8 @@ func TestAppendMemoryFileBackedMem(t *testing.T) {
testConfigAppend(conf, conf.Memory, memString, t) testConfigAppend(conf, conf.Memory, memString, t)
knobs := Knobs{ knobs := Knobs{
FileBackedMem: true, FileBackedMem: true,
FileBackedMemShared: false, MemShared: false,
} }
knobsString := "-object memory-backend-file,id=dimm1,size=1G,mem-path=foobar -numa node,memdev=dimm1" knobsString := "-object memory-backend-file,id=dimm1,size=1G,mem-path=foobar -numa node,memdev=dimm1"
mlockFalseString := "-realtime mlock=off" mlockFalseString := "-realtime mlock=off"
@ -611,6 +610,29 @@ func TestAppendMemoryFileBackedMem(t *testing.T) {
testConfigAppend(conf, knobs, memString+" "+knobsString+" "+mlockFalseString, 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" 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) { func TestAppendKernel(t *testing.T) {
@ -987,7 +1009,7 @@ func TestBadMemoryKnobs(t *testing.T) {
c = &Config{ c = &Config{
Knobs: Knobs{ Knobs: Knobs{
HugePages: true, MemShared: true,
}, },
} }
c.appendMemoryKnobs() c.appendMemoryKnobs()
@ -1004,19 +1026,6 @@ func TestBadMemoryKnobs(t *testing.T) {
if len(c.qemuParams) != 0 { if len(c.qemuParams) != 0 {
t.Errorf("Expected empty qemuParams, found %s", c.qemuParams) 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) { func TestBadKnobs(t *testing.T) {