mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-04-29 20:24:31 +00:00
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:
parent
30bfcaaa6d
commit
234e0edfd7
70
qemu/qemu.go
70
qemu/qemu.go
@ -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() {
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user