[libvirt] [PATCH 2/3] qemu: Use qemuDomainMemoryLimit when computing memory for VFIO

2013-06-28 Thread Jiri Denemark
---
 src/qemu/qemu_command.c | 17 +++--
 src/qemu/qemu_domain.c  | 16 
 src/qemu/qemu_hotplug.c | 18 --
 3 files changed, 31 insertions(+), 20 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 4d70004..f902501 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6683,6 +6683,7 @@ qemuBuildCommandLine(virConnectPtr conn,
 int spice = 0;
 int usbcontroller = 0;
 bool usblegacy = false;
+bool mlock = false;
 int contOrder[] = {
 /* We don't add an explicit IDE or FD controller because the
  * provided PIIX4 device already includes one. It isn't possible to
@@ -8337,22 +8338,15 @@ qemuBuildCommandLine(virConnectPtr conn,
 
 if (hostdev->source.subsys.u.pci.backend
 == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
-unsigned long long memKB;
-
 if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("VFIO PCI device assignment is not "
  "supported by this version of qemu"));
 goto error;
 }
-/* VFIO requires all of the guest's memory to be
- * locked resident, plus some amount for IO
- * space. Alex Williamson suggested adding 1GiB for IO
- * space just to be safe (some finer tuning might be
- * nice, though).
- */
-memKB = def->mem.max_balloon + (1024 * 1024);
-virCommandSetMaxMemLock(cmd, memKB * 1024);
+/* VFIO requires all of the guest's memory to be locked
+ * resident */
+mlock = true;
 }
 
 if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
@@ -8572,6 +8566,9 @@ qemuBuildCommandLine(virConnectPtr conn,
 goto error;
 }
 
+if (mlock)
+virCommandSetMaxMemLock(cmd, qemuDomainMemoryLimit(def) * 1024);
+
 virObjectUnref(cfg);
 return cmd;
 
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 77b94ec..8952a79 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2199,6 +2199,10 @@ qemuDomainMemoryLimit(virDomainDefPtr def)
  * cache per each disk) + F
  * where k = 0.5 and F = 200MB.  The cache for disks is important as
  * kernel cache on the host side counts into the RSS limit.
+ *
+ * Moreover, VFIO requires some amount for IO space. Alex Williamson
+ * suggested adding 1GiB for IO space just to be safe (some finer
+ * tuning might be nice, though).
  */
 mem = def->mem.max_balloon;
 for (i = 0; i < def->nvideos; i++)
@@ -2206,6 +2210,18 @@ qemuDomainMemoryLimit(virDomainDefPtr def)
 mem *= 1.5;
 mem += def->ndisks * 32768;
 mem += 204800;
+
+for (i = 0; i < def->nhostdevs; i++) {
+virDomainHostdevDefPtr hostdev = def->hostdevs[i];
+if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
+hostdev->source.subsys.type ==
+VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
+hostdev->source.subsys.u.pci.backend ==
+VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
+mem += 1024 * 1024;
+break;
+}
+}
 }
 
 return mem;
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 46875ad..a350059 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1054,23 +1054,21 @@ int qemuDomainAttachHostPciDevice(virQEMUDriverPtr 
driver,
 
 if (hostdev->source.subsys.u.pci.backend
 == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
-unsigned long long memKB;
-
 if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("VFIO PCI device assignment is not "
  "supported by this version of qemu"));
 goto error;
 }
-/* VFIO requires all of the guest's memory to be locked
- * resident, plus some amount for IO space. Alex Williamson
- * suggested adding 1GiB for IO space just to be safe (some
- * finer tuning might be nice, though).
- * In this case, the guest's memory may already be locked, but
- * it doesn't hurt to "change" the limit to the same value.
+
+/* VFIO requires all of the guest's memory to be locked resident.
+ * In this case, the guest's memory may already be locked, but it
+ * doesn't hurt to "change" the limit to the same value.
  */
-memKB = vm->def->mem.max_balloon + (1024 * 1024);
-virProcessSetMaxMemLock(vm->pid, memKB * 1024);
+vm->def->hostdevs[vm->def->nhostde

Re: [libvirt] [PATCH 2/3] qemu: Use qemuDomainMemoryLimit when computing memory for VFIO

2013-06-28 Thread Laine Stump
On 06/28/2013 11:04 AM, Jiri Denemark wrote:
> ---
>  src/qemu/qemu_command.c | 17 +++--
>  src/qemu/qemu_domain.c  | 16 
>  src/qemu/qemu_hotplug.c | 18 --
>  3 files changed, 31 insertions(+), 20 deletions(-)

ACK, pending a short discussion/explanation of the method used to
computer the memory size in 1/3.

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list