]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu_domain: NVLink2 bridge detection function for PPC64
authorDaniel Henrique Barboza <danielhb413@gmail.com>
Thu, 4 Apr 2019 13:40:38 +0000 (10:40 -0300)
committerErik Skultety <eskultet@redhat.com>
Mon, 15 Apr 2019 05:06:52 +0000 (07:06 +0200)
The NVLink2 support in QEMU implements the detection of NVLink2
capable devices by verifying the attributes of the VFIO mem region
QEMU allocates for the NVIDIA GPUs. To properly allocate an
adequate amount of memLock, Libvirt needs this information before
a QEMU instance is even created, thus querying QEMU is not
possible and opening a VFIO window is too much.

An alternative is presented in this patch. Making the following
assumptions:

- if we want GPU RAM to be available in the guest, an NVLink2 bridge
must be passed through;

- an unknown PCI device can be classified as a NVLink2 bridge
if its device tree node has 'ibm,gpu', 'ibm,nvlink',
'ibm,nvlink-speed' and 'memory-region'.

This patch introduces a helper called @ppc64VFIODeviceIsNV2Bridge
that checks the device tree node of a given PCI device and
check if it meets the criteria to be a NVLink2 bridge. This
new function will be used in a follow-up patch that, using the
first assumption, will set up the rlimits of the guest
accordingly.

Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
src/qemu/qemu_domain.c

index f4bfccdb3d0d830c45ca7bc3d44a8e84345cd4bf..ddcceee16fd86f6ef000ac7e9dbb13f2f8de2ba6 100644 (file)
@@ -10350,6 +10350,36 @@ qemuDomainUpdateCurrentMemorySize(virDomainObjPtr vm)
 }
 
 
+/**
+ * ppc64VFIODeviceIsNV2Bridge:
+ * @device: string with the PCI device address
+ *
+ * This function receives a string that represents a PCI device,
+ * such as '0004:04:00.0', and tells if the device is a NVLink2
+ * bridge.
+ */
+static ATTRIBUTE_UNUSED bool
+ppc64VFIODeviceIsNV2Bridge(const char *device)
+{
+    const char *nvlink2Files[] = {"ibm,gpu", "ibm,nvlink",
+                                  "ibm,nvlink-speed", "memory-region"};
+    size_t i;
+
+    for (i = 0; i < ARRAY_CARDINALITY(nvlink2Files); i++) {
+        VIR_AUTOFREE(char *) file = NULL;
+
+        if ((virAsprintf(&file, "/sys/bus/pci/devices/%s/of_node/%s",
+                         device, nvlink2Files[i])) < 0)
+            return false;
+
+        if (!virFileExists(file))
+            return false;
+    }
+
+    return true;
+}
+
+
 /**
  * getPPC64MemLockLimitBytes:
  * @def: domain definition