From 2a2d5860435909f5619725a6c29583db90aa789b Mon Sep 17 00:00:00 2001 From: Jonathon Jongsma Date: Thu, 17 Nov 2022 12:15:23 -0600 Subject: [PATCH] qemu: fix memlock without vIOMMU When there is no vIOMMU, vfio devices don't need to lock the entire guest memory per-device, but they still need to lock the entire guest memory to share between all vfio devices. This memory accounting is not shared with vDPA devices, so it should be added to the memlock limit separately. Commit 8d5704e2 added support for multiple vfio/vdpa devices but calculated the limits incorrectly when there were both vdpa and vfio devices and no vIOMMU. In this case, the memory lock limit was not increased separately for the vfio devices. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2143838 Signed-off-by: Jonathon Jongsma Reviewed-by: Laine Stump --- src/qemu/qemu_domain.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ef1a9c8c74..8ae458ae45 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -9470,10 +9470,14 @@ qemuDomainGetMemLockLimitBytes(virDomainDef *def, */ int factor = nvdpa; - if (def->iommu) - factor += nvfio; + if (nvfio || forceVFIO) { + if (nvfio && def->iommu) + factor += nvfio; + else + factor += 1; + } - memKB = MAX(factor, 1) * virDomainDefGetMemoryTotal(def) + 1024 * 1024; + memKB = factor * virDomainDefGetMemoryTotal(def) + 1024 * 1024; } return memKB << 10; -- 2.39.5