|
|
c480ed |
From 8996236421b4adf090ac721e8d525953deb9687a Mon Sep 17 00:00:00 2001
|
|
|
c480ed |
Message-Id: <8996236421b4adf090ac721e8d525953deb9687a@dist-git>
|
|
|
c480ed |
From: Daniel Henrique Barboza <danielhb413@gmail.com>
|
|
|
c480ed |
Date: Fri, 3 May 2019 13:54:52 +0200
|
|
|
c480ed |
Subject: [PATCH] qemu_domain: NVLink2 bridge detection function for PPC64
|
|
|
c480ed |
|
|
|
c480ed |
The NVLink2 support in QEMU implements the detection of NVLink2
|
|
|
c480ed |
capable devices by verifying the attributes of the VFIO mem region
|
|
|
c480ed |
QEMU allocates for the NVIDIA GPUs. To properly allocate an
|
|
|
c480ed |
adequate amount of memLock, Libvirt needs this information before
|
|
|
c480ed |
a QEMU instance is even created, thus querying QEMU is not
|
|
|
c480ed |
possible and opening a VFIO window is too much.
|
|
|
c480ed |
|
|
|
c480ed |
An alternative is presented in this patch. Making the following
|
|
|
c480ed |
assumptions:
|
|
|
c480ed |
|
|
|
c480ed |
- if we want GPU RAM to be available in the guest, an NVLink2 bridge
|
|
|
c480ed |
must be passed through;
|
|
|
c480ed |
|
|
|
c480ed |
- an unknown PCI device can be classified as a NVLink2 bridge
|
|
|
c480ed |
if its device tree node has 'ibm,gpu', 'ibm,nvlink',
|
|
|
c480ed |
'ibm,nvlink-speed' and 'memory-region'.
|
|
|
c480ed |
|
|
|
c480ed |
This patch introduces a helper called @ppc64VFIODeviceIsNV2Bridge
|
|
|
c480ed |
that checks the device tree node of a given PCI device and
|
|
|
c480ed |
check if it meets the criteria to be a NVLink2 bridge. This
|
|
|
c480ed |
new function will be used in a follow-up patch that, using the
|
|
|
c480ed |
first assumption, will set up the rlimits of the guest
|
|
|
c480ed |
accordingly.
|
|
|
c480ed |
|
|
|
c480ed |
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
|
|
|
c480ed |
(cherry picked from commit cc9f03801c2618102027ddc4a988193ae290b651)
|
|
|
c480ed |
|
|
|
c480ed |
https: //bugzilla.redhat.com/show_bug.cgi?id=1505998
|
|
|
c480ed |
Signed-off-by: Erik Skultety <eskultet@redhat.com>
|
|
|
c480ed |
Message-Id: <99efa386adcf68789b7c8cffda2ef24f5f47f0c4.1556884443.git.eskultet@redhat.com>
|
|
|
c480ed |
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
|
|
|
c480ed |
---
|
|
|
c480ed |
src/qemu/qemu_domain.c | 30 ++++++++++++++++++++++++++++++
|
|
|
c480ed |
1 file changed, 30 insertions(+)
|
|
|
c480ed |
|
|
|
c480ed |
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
|
|
c480ed |
index f91de0b743..a8bc618389 100644
|
|
|
c480ed |
--- a/src/qemu/qemu_domain.c
|
|
|
c480ed |
+++ b/src/qemu/qemu_domain.c
|
|
|
c480ed |
@@ -9805,6 +9805,36 @@ qemuDomainUpdateCurrentMemorySize(virQEMUDriverPtr driver,
|
|
|
c480ed |
}
|
|
|
c480ed |
|
|
|
c480ed |
|
|
|
c480ed |
+/**
|
|
|
c480ed |
+ * ppc64VFIODeviceIsNV2Bridge:
|
|
|
c480ed |
+ * @device: string with the PCI device address
|
|
|
c480ed |
+ *
|
|
|
c480ed |
+ * This function receives a string that represents a PCI device,
|
|
|
c480ed |
+ * such as '0004:04:00.0', and tells if the device is a NVLink2
|
|
|
c480ed |
+ * bridge.
|
|
|
c480ed |
+ */
|
|
|
c480ed |
+static ATTRIBUTE_UNUSED bool
|
|
|
c480ed |
+ppc64VFIODeviceIsNV2Bridge(const char *device)
|
|
|
c480ed |
+{
|
|
|
c480ed |
+ const char *nvlink2Files[] = {"ibm,gpu", "ibm,nvlink",
|
|
|
c480ed |
+ "ibm,nvlink-speed", "memory-region"};
|
|
|
c480ed |
+ size_t i;
|
|
|
c480ed |
+
|
|
|
c480ed |
+ for (i = 0; i < ARRAY_CARDINALITY(nvlink2Files); i++) {
|
|
|
c480ed |
+ VIR_AUTOFREE(char *) file = NULL;
|
|
|
c480ed |
+
|
|
|
c480ed |
+ if ((virAsprintf(&file, "/sys/bus/pci/devices/%s/of_node/%s",
|
|
|
c480ed |
+ device, nvlink2Files[i])) < 0)
|
|
|
c480ed |
+ return false;
|
|
|
c480ed |
+
|
|
|
c480ed |
+ if (!virFileExists(file))
|
|
|
c480ed |
+ return false;
|
|
|
c480ed |
+ }
|
|
|
c480ed |
+
|
|
|
c480ed |
+ return true;
|
|
|
c480ed |
+}
|
|
|
c480ed |
+
|
|
|
c480ed |
+
|
|
|
c480ed |
/**
|
|
|
c480ed |
* getPPC64MemLockLimitBytes:
|
|
|
c480ed |
* @def: domain definition
|
|
|
c480ed |
--
|
|
|
c480ed |
2.21.0
|
|
|
c480ed |
|