提交 1c4f3b56 编写于 作者: J Jaroslav Safka 提交者: Michal Privoznik

qemu: Add args generation for file memory backing

This patch add support for file memory backing on numa topology.

The specified access mode in memoryBacking can be overriden
by specifying token memAccess in numa cell.
上级 bc6d3121
......@@ -3314,17 +3314,26 @@ qemuBuildMemoryBackendStr(unsigned long long size,
if (!(props = virJSONValueNewObject()))
return -1;
if (pagesize) {
if (qemuGetDomainHupageMemPath(def, cfg, pagesize, &mem_path) < 0)
goto cleanup;
if (pagesize || def->mem.source == VIR_DOMAIN_MEMORY_SOURCE_FILE) {
*backendType = "memory-backend-file";
if (virJSONValueObjectAdd(props,
"b:prealloc", true,
"s:mem-path", mem_path,
NULL) < 0)
goto cleanup;
if (def->mem.source == VIR_DOMAIN_MEMORY_SOURCE_FILE) {
/* we can have both pagesize and mem source, then check mem source first */
force = true;
if (virJSONValueObjectAdd(props,
"s:mem-path", cfg->memoryBackingDir,
NULL) < 0)
goto cleanup;
} else {
if (qemuGetDomainHupageMemPath(def, cfg, pagesize, &mem_path) < 0)
goto cleanup;
if (virJSONValueObjectAdd(props,
"b:prealloc", true,
"s:mem-path", mem_path,
NULL) < 0)
goto cleanup;
}
switch (memAccess) {
case VIR_DOMAIN_MEMORY_ACCESS_SHARED:
......@@ -3338,6 +3347,12 @@ qemuBuildMemoryBackendStr(unsigned long long size,
break;
case VIR_DOMAIN_MEMORY_ACCESS_DEFAULT:
if (def->mem.access == VIR_DOMAIN_MEMORY_ACCESS_SHARED) {
if (virJSONValueObjectAdd(props, "b:share", true, NULL) < 0)
goto cleanup;
}
break;
case VIR_DOMAIN_MEMORY_ACCESS_LAST:
break;
}
......@@ -7313,7 +7328,10 @@ qemuBuildMemPathStr(virQEMUDriverConfigPtr cfg,
if (qemuGetDomainHupageMemPath(def, cfg, def->mem.hugepages[0].size, &mem_path) < 0)
return -1;
virCommandAddArgList(cmd, "-mem-prealloc", "-mem-path", mem_path, NULL);
if (def->mem.allocation != VIR_DOMAIN_MEMORY_ALLOCATION_IMMEDIATE)
virCommandAddArgList(cmd, "-mem-prealloc", NULL);
virCommandAddArgList(cmd, "-mem-path", mem_path, NULL);
VIR_FREE(mem_path);
return 0;
......@@ -7343,9 +7361,12 @@ qemuBuildMemCommandLine(virCommandPtr cmd,
virDomainDefGetMemoryInitial(def) / 1024);
}
if (def->mem.allocation == VIR_DOMAIN_MEMORY_ALLOCATION_IMMEDIATE)
virCommandAddArgList(cmd, "-mem-prealloc", NULL);
/*
* Add '-mem-path' (and '-mem-prealloc') parameter here only if
* there is no numa node specified.
* Add '-mem-path' (and '-mem-prealloc') parameter here if
* the hugepages and no numa node is specified.
*/
if (!virDomainNumaGetNodeCount(def->numa) &&
qemuBuildMemPathStr(cfg, def, qemuCaps, cmd) < 0)
......
LC_ALL=C \
PATH=/bin \
HOME=/home/test \
USER=test \
LOGNAME=test \
QEMU_AUDIO_DRV=none \
/usr/bin/qemu-system-x86_64 \
-name instance-00000092 \
-S \
-M pc-i440fx-wily \
-m 14336 \
-mem-prealloc \
-smp 8,sockets=8,cores=1,threads=1 \
-uuid 126f2720-6f8e-45ab-a886-ec9277079a67 \
-nographic \
-nodefaults \
-monitor unix:/tmp/lib/domain--1-instance-00000092/monitor.sock,server,nowait \
-no-acpi \
-boot c \
-usb \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
<domain type='kvm' id='56'>
<name>instance-00000092</name>
<uuid>126f2720-6f8e-45ab-a886-ec9277079a67</uuid>
<memory unit='KiB'>14680064</memory>
<currentMemory unit='KiB'>14680064</currentMemory>
<memoryBacking>
<source type='file'/>
<access mode='shared'/>
<allocation mode='immediate'/>
</memoryBacking>
<vcpu placement='static'>8</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-wily'>hvm</type>
<boot dev='hd'/>
</os>
<cpu>
<topology sockets='8' cores='1' threads='1'/>
</cpu>
<clock offset='utc' />
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<memballoon model='virtio'/>
</devices>
</domain>
LC_ALL=C \
PATH=/bin \
HOME=/home/test \
USER=test \
LOGNAME=test \
QEMU_AUDIO_DRV=none \
/usr/bin/qemu-system-x86_64 \
-name instance-00000092 \
-S \
-M pc-i440fx-wily \
-m 14336 \
-mem-prealloc \
-smp 8,sockets=1,cores=8,threads=1 \
-object memory-backend-file,id=ram-node0,mem-path=/var/lib/libvirt/qemu/ram,\
share=yes,size=15032385536 \
-numa node,nodeid=0,cpus=0-7,memdev=ram-node0 \
-uuid 126f2720-6f8e-45ab-a886-ec9277079a67 \
-nographic \
-nodefaults \
-monitor unix:/tmp/lib/domain--1-instance-00000092/monitor.sock,server,nowait \
-no-acpi \
-boot c \
-usb \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
<domain type='kvm'>
<name>instance-00000092</name>
<uuid>126f2720-6f8e-45ab-a886-ec9277079a67</uuid>
<memory unit='KiB'>14680064</memory>
<currentMemory unit='KiB'>14680064</currentMemory>
<memoryBacking>
<source type='file'/>
<access mode='shared'/>
<allocation mode='immediate'/>
</memoryBacking>
<vcpu placement='static'>8</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-wily'>hvm</type>
<boot dev='hd'/>
</os>
<cpu>
<topology sockets='1' cores='8' threads='1'/>
<numa>
<cell id='0' cpus='0-7' memory='14680064' unit='KiB'/>
</numa>
</cpu>
<clock offset='utc' />
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<memballoon model='virtio'/>
</devices>
</domain>
LC_ALL=C \
PATH=/bin \
HOME=/home/test \
USER=test \
LOGNAME=test \
QEMU_AUDIO_DRV=none \
/usr/bin/qemu-system-x86_64 \
-name instance-00000092 \
-S \
-M pc-i440fx-wily \
-m 28672 \
-mem-prealloc \
-smp 20,sockets=1,cores=8,threads=1 \
-object memory-backend-file,id=ram-node0,mem-path=/var/lib/libvirt/qemu/ram,\
size=15032385536 \
-numa node,nodeid=0,cpus=0-7,memdev=ram-node0 \
-object memory-backend-file,id=ram-node1,mem-path=/var/lib/libvirt/qemu/ram,\
share=yes,size=15032385536 \
-numa node,nodeid=1,cpus=8-15,memdev=ram-node1 \
-uuid 126f2720-6f8e-45ab-a886-ec9277079a67 \
-nographic \
-nodefaults \
-monitor unix:/tmp/lib/domain--1-instance-00000092/monitor.sock,server,nowait \
-no-acpi \
-boot c \
-usb \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
<domain type='kvm' id='56'>
<name>instance-00000092</name>
<uuid>126f2720-6f8e-45ab-a886-ec9277079a67</uuid>
<memory unit='KiB'>14680064</memory>
<currentMemory unit='KiB'>14680064</currentMemory>
<memoryBacking>
<source type='file'/>
<access mode='private'/>
<allocation mode='immediate'/>
</memoryBacking>
<vcpu placement='static'>20</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-wily'>hvm</type>
<boot dev='hd'/>
</os>
<cpu>
<topology sockets='1' cores='8' threads='1'/>
<numa>
<cell id='0' cpus='0-7' memory='14680064' unit='KiB'/>
<cell id='1' cpus='8-15' memory='14680064' unit='KiB' memAccess='shared'/>
</numa>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<memballoon model='virtio'/>
</devices>
</domain>
LC_ALL=C \
PATH=/bin \
HOME=/home/test \
USER=test \
LOGNAME=test \
QEMU_AUDIO_DRV=none \
/usr/bin/qemu-system-x86_64 \
-name instance-00000092 \
-S \
-M pc-i440fx-wily \
-m 43008 \
-mem-prealloc \
-smp 32,sockets=1,cores=24,threads=1 \
-object memory-backend-file,id=ram-node0,mem-path=/var/lib/libvirt/qemu/ram,\
share=yes,size=15032385536 \
-numa node,nodeid=0,cpus=0-1,memdev=ram-node0 \
-object memory-backend-file,id=ram-node1,mem-path=/var/lib/libvirt/qemu/ram,\
share=yes,size=15032385536 \
-numa node,nodeid=1,cpus=2-3,memdev=ram-node1 \
-object memory-backend-file,id=ram-node2,mem-path=/var/lib/libvirt/qemu/ram,\
share=no,size=15032385536 \
-numa node,nodeid=2,cpus=4-5,memdev=ram-node2 \
-uuid 126f2720-6f8e-45ab-a886-ec9277079a67 \
-nographic \
-nodefaults \
-monitor unix:/tmp/lib/domain--1-instance-00000092/monitor.sock,server,nowait \
-no-acpi \
-boot c \
-usb \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
<domain type='kvm' id='56'>
<name>instance-00000092</name>
<uuid>126f2720-6f8e-45ab-a886-ec9277079a67</uuid>
<memory unit='KiB'>14680064</memory>
<currentMemory unit='KiB'>14680064</currentMemory>
<memoryBacking>
<source type='file'/>
<access mode='shared'/>
<allocation mode='immediate'/>
</memoryBacking>
<vcpu placement='static'>32</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-wily'>hvm</type>
<boot dev='hd'/>
</os>
<cpu>
<topology sockets='1' cores='24' threads='1'/>
<numa>
<cell id='0' cpus='0-1' memory='14680064' unit='KiB'/>
<cell id='1' cpus='2-3' memory='14680064' unit='KiB' memAccess='shared'/>
<cell id='2' cpus='4-5' memory='14680064' unit='KiB' memAccess='private'/>
</numa>
</cpu>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<memballoon model='virtio'/>
</devices>
</domain>
......@@ -594,6 +594,9 @@ mymain(void)
driver.config->spiceTLS = 1;
if (VIR_STRDUP_QUIET(driver.config->spicePassword, "123456") < 0)
return EXIT_FAILURE;
VIR_FREE(driver.config->memoryBackingDir);
if (VIR_STRDUP_QUIET(driver.config->memoryBackingDir, "/var/lib/libvirt/qemu/ram") < 0)
return EXIT_FAILURE;
# define DO_TEST_FULL(name, migrateFrom, migrateFd, flags, \
parseFlags, gic, ...) \
......@@ -2468,6 +2471,16 @@ mymain(void)
DO_TEST("cpu-hotplug-startup", QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS);
DO_TEST("fd-memory-numa-topology", QEMU_CAPS_MEM_PATH, QEMU_CAPS_OBJECT_MEMORY_FILE,
QEMU_CAPS_KVM);
DO_TEST("fd-memory-numa-topology2", QEMU_CAPS_MEM_PATH, QEMU_CAPS_OBJECT_MEMORY_FILE,
QEMU_CAPS_KVM);
DO_TEST("fd-memory-numa-topology3", QEMU_CAPS_MEM_PATH, QEMU_CAPS_OBJECT_MEMORY_FILE,
QEMU_CAPS_KVM);
DO_TEST("fd-memory-no-numa-topology", QEMU_CAPS_MEM_PATH, QEMU_CAPS_OBJECT_MEMORY_FILE,
QEMU_CAPS_KVM);
qemuTestDriverFree(&driver);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册