提交 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, ...@@ -3314,17 +3314,26 @@ qemuBuildMemoryBackendStr(unsigned long long size,
if (!(props = virJSONValueNewObject())) if (!(props = virJSONValueNewObject()))
return -1; return -1;
if (pagesize) { if (pagesize || def->mem.source == VIR_DOMAIN_MEMORY_SOURCE_FILE) {
if (qemuGetDomainHupageMemPath(def, cfg, pagesize, &mem_path) < 0)
goto cleanup;
*backendType = "memory-backend-file"; *backendType = "memory-backend-file";
if (virJSONValueObjectAdd(props, if (def->mem.source == VIR_DOMAIN_MEMORY_SOURCE_FILE) {
"b:prealloc", true, /* we can have both pagesize and mem source, then check mem source first */
"s:mem-path", mem_path, force = true;
NULL) < 0) if (virJSONValueObjectAdd(props,
goto cleanup; "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) { switch (memAccess) {
case VIR_DOMAIN_MEMORY_ACCESS_SHARED: case VIR_DOMAIN_MEMORY_ACCESS_SHARED:
...@@ -3338,6 +3347,12 @@ qemuBuildMemoryBackendStr(unsigned long long size, ...@@ -3338,6 +3347,12 @@ qemuBuildMemoryBackendStr(unsigned long long size,
break; break;
case VIR_DOMAIN_MEMORY_ACCESS_DEFAULT: 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: case VIR_DOMAIN_MEMORY_ACCESS_LAST:
break; break;
} }
...@@ -7313,7 +7328,10 @@ qemuBuildMemPathStr(virQEMUDriverConfigPtr cfg, ...@@ -7313,7 +7328,10 @@ qemuBuildMemPathStr(virQEMUDriverConfigPtr cfg,
if (qemuGetDomainHupageMemPath(def, cfg, def->mem.hugepages[0].size, &mem_path) < 0) if (qemuGetDomainHupageMemPath(def, cfg, def->mem.hugepages[0].size, &mem_path) < 0)
return -1; 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); VIR_FREE(mem_path);
return 0; return 0;
...@@ -7343,9 +7361,12 @@ qemuBuildMemCommandLine(virCommandPtr cmd, ...@@ -7343,9 +7361,12 @@ qemuBuildMemCommandLine(virCommandPtr cmd,
virDomainDefGetMemoryInitial(def) / 1024); 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 * Add '-mem-path' (and '-mem-prealloc') parameter here if
* there is no numa node specified. * the hugepages and no numa node is specified.
*/ */
if (!virDomainNumaGetNodeCount(def->numa) && if (!virDomainNumaGetNodeCount(def->numa) &&
qemuBuildMemPathStr(cfg, def, qemuCaps, cmd) < 0) 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) ...@@ -594,6 +594,9 @@ mymain(void)
driver.config->spiceTLS = 1; driver.config->spiceTLS = 1;
if (VIR_STRDUP_QUIET(driver.config->spicePassword, "123456") < 0) if (VIR_STRDUP_QUIET(driver.config->spicePassword, "123456") < 0)
return EXIT_FAILURE; 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, \ # define DO_TEST_FULL(name, migrateFrom, migrateFd, flags, \
parseFlags, gic, ...) \ parseFlags, gic, ...) \
...@@ -2468,6 +2471,16 @@ mymain(void) ...@@ -2468,6 +2471,16 @@ mymain(void)
DO_TEST("cpu-hotplug-startup", QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS); 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); qemuTestDriverFree(&driver);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册