mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-08 12:41:29 +00:00
qemu: Align memory module sizes to 2MiB
My original implementation was based on a qemu version that still did not have all the checks in place. Using sizes that would align to odd megabyte increments will produce the following error: qemu-kvm: -device pc-dimm,node=0,memdev=memdimm0,id=dimm0: backend memory size must be multiple of 0x200000 qemu-kvm: -device pc-dimm,node=0,memdev=memdimm0,id=dimm0: Device 'pc-dimm' could not be initialized Introduce an alignment retrieval function for memory devices and use it to align the devices separately and modify a test case to verify it.
This commit is contained in:
parent
035947eb87
commit
624ec1c2f9
@ -3376,6 +3376,21 @@ qemuDomainGetMemorySizeAlignment(virDomainDefPtr def)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static unsigned long long
|
||||||
|
qemuDomainGetMemoryModuleSizeAlignment(const virDomainDef *def,
|
||||||
|
const virDomainMemoryDef *mem ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
/* PPC requires the memory sizes to be rounded to 256MiB increments, so
|
||||||
|
* round them to the size always. */
|
||||||
|
if (ARCH_IS_PPC64(def->os.arch))
|
||||||
|
return 256 * 1024;
|
||||||
|
|
||||||
|
/* dimm memory modules require 2MiB alignment rather than the 1MiB we are
|
||||||
|
* using elsewhere. */
|
||||||
|
return 2048;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
qemuDomainAlignMemorySizes(virDomainDefPtr def)
|
qemuDomainAlignMemorySizes(virDomainDefPtr def)
|
||||||
{
|
{
|
||||||
@ -3402,8 +3417,10 @@ qemuDomainAlignMemorySizes(virDomainDefPtr def)
|
|||||||
def->mem.max_memory = VIR_ROUND_UP(def->mem.max_memory, align);
|
def->mem.max_memory = VIR_ROUND_UP(def->mem.max_memory, align);
|
||||||
|
|
||||||
/* Align memory module sizes */
|
/* Align memory module sizes */
|
||||||
for (i = 0; i < def->nmems; i++)
|
for (i = 0; i < def->nmems; i++) {
|
||||||
|
align = qemuDomainGetMemoryModuleSizeAlignment(def, def->mems[i]);
|
||||||
def->mems[i]->size = VIR_ROUND_UP(def->mems[i]->size, align);
|
def->mems[i]->size = VIR_ROUND_UP(def->mems[i]->size, align);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
<memballoon model='virtio'/>
|
<memballoon model='virtio'/>
|
||||||
<memory model='dimm'>
|
<memory model='dimm'>
|
||||||
<target>
|
<target>
|
||||||
<size unit='KiB'>524287</size>
|
<size unit='KiB'>523264</size>
|
||||||
<node>0</node>
|
<node>0</node>
|
||||||
</target>
|
</target>
|
||||||
</memory>
|
</memory>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user