]> git.ipfire.org Git - thirdparty/libvirt.git/commit
domain_validate: Account for NVDIMM label size properly when checking for memory...
authorMichal Privoznik <mprivozn@redhat.com>
Mon, 19 Feb 2024 14:37:16 +0000 (15:37 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 22 Feb 2024 09:53:56 +0000 (10:53 +0100)
commit4545f313c23e7000451d1cec793ebc8da1a2c25f
treec755e612048ba7538a886ed4842cde805f8a7813
parent969353f97847394fca1dcd5f2d7af17fae7a1cbc
domain_validate: Account for NVDIMM label size properly when checking for memory conflicts

As of v9.8.0-rc1~7 we check whether two <memory/> devices don't
overlap (since we allow setting where a <memory/> device should
be mapped to). We do this pretty straightforward, by comparing
start and end address of each <memory/> device combination.
But since only the start address is given (an exposed in the
XML), the end address is computed trivially as:

  start + mem->size * 1024

And for majority of memory device types this works. Except for
NVDIMMs. For them the <memory/> device consists of two separate
regions: 1) actual memory device, and 2) label.

Label is where NVDIMM stores some additional information like
namespaces partition and so on. But it's not mapped into the
guest the same way as actual memory device. In fact, mem->size is
a sum of both actual memory device and label sizes. And to make
things a bit worse, both sizes are subject to alignment (either
the alignsize value specified in XML, or system page size if not
specified in XML).

Therefore, to get the size of actual memory device we need to
take mem->size and substract label size rounded up to alignment.

If we don't do this we report there's an overlap between two
NVDIMMs even when in reality there's none.

Fixes: 3fd64fb0e236fc80ffa2cc977c0d471f11fc39bf
Fixes: 91f9a9fb4fc0d34ed8d7a869de3d9f87687c3618
Resolves: https://issues.redhat.com/browse/RHEL-4452?focusedId=23805174#comment-23805174
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
src/conf/domain_validate.c