]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Take NVMe disks into account when calculating memlock limit
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 25 Jun 2019 13:36:44 +0000 (15:36 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 17 Dec 2019 09:04:43 +0000 (10:04 +0100)
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@redhat.com>
ACKed-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Cole Robinson <crobinso@redhat.com>
src/qemu/qemu_domain.c

index fb6dee6bde152fa71d732930de68efb2d7a88675..8ab276c321116e07542b62ea8b7543a208901adf 100644 (file)
@@ -12881,6 +12881,9 @@ getPPC64MemLockLimitBytes(virDomainDefPtr def)
         }
     }
 
+    if (virDomainDefHasNVMeDisk(def))
+        usesVFIO = true;
+
     memory = virDomainDefGetMemoryTotal(def);
 
     if (def->mem.max_memory)
@@ -12979,6 +12982,7 @@ unsigned long long
 qemuDomainGetMemLockLimitBytes(virDomainDefPtr def)
 {
     unsigned long long memKB = 0;
+    bool usesVFIO = false;
     size_t i;
 
     /* prefer the hard limit */
@@ -13019,11 +13023,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;
 }