[libvirt] [PATCH v3 19/30] qemu: Take NVMe disks into account when calculating memlock limit
Cole Robinson
crobinso at redhat.com
Tue Dec 10 19:33:50 UTC 2019
On 12/2/19 9:26 AM, Michal Privoznik wrote:
> We have this beautiful function that does crystal ball
> divination. The function is named
> qemuDomainGetMemLockLimitBytes() and it calculates the upper
> limit of how much locked memory is given guest going to need. The
> function bases its guess on devices defined for a domain. For
> instance, if there is a VFIO hostdev defined then it adds 1GiB to
> the guessed maximum. Since NVMe disks are pretty much VFIO
> hostdevs (but not quite), we have to do the same sorcery.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ACKed-by: Peter Krempa <pkrempa at redhat.com>
> ---
> src/qemu/qemu_domain.c | 14 ++++++++++++--
> 1 file changed, 12 insertions(+), 2 deletions(-)
>
For the patch as-is
Reviewed-by: Cole Robinson <crobinso at redhat.com>
But...
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 59e98de2d2..7b515b9520 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -11920,6 +11920,9 @@ getPPC64MemLockLimitBytes(virDomainDefPtr def)
> }
> }
>
> + if (virDomainDefHasNVMeDisk(def))
> + usesVFIO = true;
> +
We have qemuDomainNeedsVFIO which helpully captures these rules. Looks
the logic has already diverged for ppc here because it doesn't consider
IsMdev devices. Something for a future patch
- Cole
> memory = virDomainDefGetMemoryTotal(def);
>
> if (def->mem.max_memory)
> @@ -12018,6 +12021,7 @@ unsigned long long
> qemuDomainGetMemLockLimitBytes(virDomainDefPtr def)
> {
> unsigned long long memKB = 0;
> + bool usesVFIO = false;
> size_t i;
>
> /* prefer the hard limit */
> @@ -12058,11 +12062,17 @@ qemuDomainGetMemLockLimitBytes(virDomainDefPtr def)
> for (i = 0; i < def->nhostdevs; i++) {
> if (virHostdevIsVFIODevice(def->hostdevs[i]) ||
> virHostdevIsMdevDevice(def->hostdevs[i])) {
> - memKB = virDomainDefGetMemoryTotal(def) + 1024 * 1024;
> - goto done;
> + usesVFIO = true;
> + break;
> }
> }
>
> + if (virDomainDefHasNVMeDisk(def))
> + usesVFIO = true;
> +
> + if (usesVFIO)
> + memKB = virDomainDefGetMemoryTotal(def) + 1024 * 1024;
> +
> done:
> return memKB << 10;
> }
>
- Cole
More information about the libvir-list
mailing list