2015-06-24 19:09:57 +03:00
<domain type= 'qemu' >
<name > fedora</name>
<uuid > 63840878-0deb-4095-97e6-fc444d9bc9fa</uuid>
qemuBuildMemoryBackendStr: Honour passed @pagesize
So far the argument has not much meaning and was practically ignored.
This is not good since when doing memory hotplug, the size of desired
hugepage backing is passed in that argument. Taking closer look at the
tests I'm fixing reveals the bug. For instance, while the following is
in the test:
<memory model='dimm'>
<source>
<nodemask>1-3</nodemask>
<pagesize unit='KiB'>4096</pagesize>
</source>
<target>
<size unit='KiB'>524287</size>
<node>0</node>
</target>
<address type='dimm' slot='0' base='0x100000000'/>
</memory>
the generated commandline corresponding to this XML was:
-object memory-backend-ram,id=memdimm0,size=536870912,\
host-nodes=1-3,policy=bind
Have you noticed? Yes, memory-backend-ram! Nothing can be further away
from the right answer. The hugepage backing is requested in the XML
and we happily ignore it. This is just not right. It's
memory-backend-file which should have been used:
-object memory-backend-file,id=memdimm0,prealloc=yes,\
mem-path=/dev/hugepages4M/libvirt/qemu,size=536870912,\
host-nodes=1-3,policy=bind
The problem is, that @pagesize passed to qemuBuildMemoryBackendStr
(where this part of commandline is built) was ignored. The hugepage to
back memory was searched only and only by NUMA nodes pinning. This
works only for regular guest NUMA nodes.
Then, I'm changing the hugepages size in the test XMLs too. This is
simply because in the test suite we create dummy mount points just for
2M and 1G hugepages. And in the test 4M was requested. I'm sticking to
2M, but 1G should just work too.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
2015-06-25 18:27:29 +03:00
<maxMemory slots= '16' unit= 'KiB' > 1099511627776</maxMemory>
2015-06-24 19:09:57 +03:00
<memory unit= 'KiB' > 1572863</memory>
<currentMemory unit= 'KiB' > 1048576</currentMemory>
<memoryBacking >
<hugepages />
</memoryBacking>
<vcpu placement= 'static' > 2</vcpu>
<os >
<type arch= 'x86_64' machine= 'pc-i440fx-2.3' > hvm</type>
<boot dev= 'hd' />
</os>
<features >
<acpi />
<apic />
<pae />
</features>
2015-06-29 14:19:21 +03:00
<cpu >
2015-06-24 19:09:57 +03:00
<numa >
<cell id= '0' cpus= '0-1' memory= '1048576' unit= 'KiB' />
</numa>
</cpu>
<clock offset= 'utc' >
<timer name= 'rtc' tickpolicy= 'catchup' />
<timer name= 'pit' tickpolicy= 'delay' />
<timer name= 'hpet' present= 'no' />
</clock>
<on_poweroff > destroy</on_poweroff>
<on_reboot > restart</on_reboot>
<on_crash > restart</on_crash>
<pm >
<suspend-to-mem enabled= 'no' />
<suspend-to-disk enabled= 'no' />
</pm>
<devices >
<emulator > /usr/bin/qemu-system-x86_64</emulator>
<disk type= 'file' device= 'disk' >
<driver name= 'qemu' type= 'qcow2' />
<source file= '/var/lib/libvirt/images/fedora.qcow2' />
<target dev= 'vda' bus= 'virtio' />
<address type= 'pci' domain= '0x0000' bus= '0x00' slot= '0x07' function= '0x0' />
</disk>
<disk type= 'block' device= 'cdrom' >
<driver name= 'qemu' type= 'raw' />
<target dev= 'hda' bus= 'ide' />
<readonly />
<address type= 'drive' controller= '0' bus= '0' target= '0' unit= '0' />
</disk>
<controller type= 'usb' index= '0' model= 'ich9-ehci1' >
<address type= 'pci' domain= '0x0000' bus= '0x00' slot= '0x06' function= '0x7' />
</controller>
<controller type= 'usb' index= '0' model= 'ich9-uhci1' >
<master startport= '0' />
<address type= 'pci' domain= '0x0000' bus= '0x00' slot= '0x06' function= '0x0' multifunction= 'on' />
</controller>
<controller type= 'usb' index= '0' model= 'ich9-uhci2' >
<master startport= '2' />
<address type= 'pci' domain= '0x0000' bus= '0x00' slot= '0x06' function= '0x1' />
</controller>
<controller type= 'usb' index= '0' model= 'ich9-uhci3' >
<master startport= '4' />
<address type= 'pci' domain= '0x0000' bus= '0x00' slot= '0x06' function= '0x2' />
</controller>
<controller type= 'pci' index= '0' model= 'pci-root' />
<controller type= 'ide' index= '0' >
<address type= 'pci' domain= '0x0000' bus= '0x00' slot= '0x01' function= '0x1' />
</controller>
<controller type= 'virtio-serial' index= '0' >
<address type= 'pci' domain= '0x0000' bus= '0x00' slot= '0x05' function= '0x0' />
</controller>
<channel type= 'unix' >
<source mode= 'bind' path= '/var/lib/libvirt/qemu/channel/target/fedora.org.qemu.guest_agent.0' />
<target type= 'virtio' name= 'org.qemu.guest_agent.0' />
<address type= 'virtio-serial' controller= '0' bus= '0' port= '1' />
</channel>
<channel type= 'spicevmc' >
<target type= 'virtio' name= 'com.redhat.spice.0' />
<address type= 'virtio-serial' controller= '0' bus= '0' port= '2' />
</channel>
<input type= 'tablet' bus= 'usb' />
<input type= 'mouse' bus= 'ps2' />
<input type= 'keyboard' bus= 'ps2' />
<graphics type= 'spice' autoport= 'yes' />
<sound model= 'ich6' >
<address type= 'pci' domain= '0x0000' bus= '0x00' slot= '0x04' function= '0x0' />
</sound>
<video >
<model type= 'qxl' ram= '65536' vram= '65536' vgamem= '16384' heads= '1' />
<address type= 'pci' domain= '0x0000' bus= '0x00' slot= '0x02' function= '0x0' />
</video>
<redirdev bus= 'usb' type= 'spicevmc' >
</redirdev>
<redirdev bus= 'usb' type= 'spicevmc' >
</redirdev>
<memballoon model= 'virtio' >
<address type= 'pci' domain= '0x0000' bus= '0x00' slot= '0x08' function= '0x0' />
</memballoon>
qemuBuildMemoryBackendStr: Honour passed @pagesize
So far the argument has not much meaning and was practically ignored.
This is not good since when doing memory hotplug, the size of desired
hugepage backing is passed in that argument. Taking closer look at the
tests I'm fixing reveals the bug. For instance, while the following is
in the test:
<memory model='dimm'>
<source>
<nodemask>1-3</nodemask>
<pagesize unit='KiB'>4096</pagesize>
</source>
<target>
<size unit='KiB'>524287</size>
<node>0</node>
</target>
<address type='dimm' slot='0' base='0x100000000'/>
</memory>
the generated commandline corresponding to this XML was:
-object memory-backend-ram,id=memdimm0,size=536870912,\
host-nodes=1-3,policy=bind
Have you noticed? Yes, memory-backend-ram! Nothing can be further away
from the right answer. The hugepage backing is requested in the XML
and we happily ignore it. This is just not right. It's
memory-backend-file which should have been used:
-object memory-backend-file,id=memdimm0,prealloc=yes,\
mem-path=/dev/hugepages4M/libvirt/qemu,size=536870912,\
host-nodes=1-3,policy=bind
The problem is, that @pagesize passed to qemuBuildMemoryBackendStr
(where this part of commandline is built) was ignored. The hugepage to
back memory was searched only and only by NUMA nodes pinning. This
works only for regular guest NUMA nodes.
Then, I'm changing the hugepages size in the test XMLs too. This is
simply because in the test suite we create dummy mount points just for
2M and 1G hugepages. And in the test 4M was requested. I'm sticking to
2M, but 1G should just work too.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
2015-06-25 18:27:29 +03:00
<memory model= 'dimm' >
<source >
<nodemask > 1-3</nodemask>
<pagesize unit= 'KiB' > 1048576</pagesize>
</source>
<target >
<size unit= 'KiB' > 1048576</size>
<node > 0</node>
</target>
</memory>
2015-06-24 19:09:57 +03:00
</devices>
</domain>