b3fbad8957
- kvm-x86_64-rh-devices-add-missing-TPM-passthrough.patch [bz#1519013] - kvm-x86_64-rh-devices-enable-TPM-emulation.patch [bz#1519013] - kvm-vfio-increase-the-cap-on-number-of-assigned-devices-.patch [bz#1719823] - Resolves: bz#1519013 ([RFE] QEMU Software TPM support (vTPM, or TPM emulation)) - Resolves: bz#1719823 ([RHEL 8.1] [RFE] increase the maximum of vfio devices to more than 32 in qemu-kvm)
112 lines
4.1 KiB
Diff
112 lines
4.1 KiB
Diff
From 2b89558946fc396c6ecb10249b69960d2a74e18f Mon Sep 17 00:00:00 2001
|
|
From: Bandan Das <bsd@redhat.com>
|
|
Date: Wed, 12 Jun 2019 16:56:23 +0100
|
|
Subject: [PATCH 3/3] vfio: increase the cap on number of assigned devices to
|
|
64
|
|
|
|
RH-Author: Bandan Das <bsd@redhat.com>
|
|
Message-id: <jpgy32691zc.fsf@linux.bootlegged.copy>
|
|
Patchwork-id: 88653
|
|
O-Subject: [RHEL-AV-8.1.0 qemu-kvm PATCH] vfio: increase the cap on number of assigned devices to 64
|
|
Bugzilla: 1719823
|
|
RH-Acked-by: Alex Williamson <alex.williamson@redhat.com>
|
|
RH-Acked-by: Auger Eric <eric.auger@redhat.com>
|
|
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
|
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1719823
|
|
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=22124174
|
|
Branch: rhel-av-8.1.0/master-4.0.0
|
|
Upstrea: N/A, the device limit change is downstream only
|
|
|
|
In addition to bumping up the limit, also add a property for
|
|
future-proofing. This needs to be set for every assigned device
|
|
or via "global": -global vfio-pci.x-assigned-device-limit
|
|
|
|
RHEL Notes:
|
|
For each vm using vfio, there is at least a container fd. For
|
|
each assigned device, there is likely a group fd, a device fd,
|
|
an error signaling fd and a device request fd. Assuming SR-IOV
|
|
VFs, vectors/device considering MSI/MSI-X could be ~3-5. Therefore,
|
|
we have ~14 file descriptors per device or 897 for 64 devices.
|
|
The default open fd limit is 1024 on Linux but libvirt bumps it to
|
|
8192 and the qemu process inherits that value as well.
|
|
|
|
Signed-off-by: Bandan Das <bsd@redhat.com>
|
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
---
|
|
hw/vfio/pci.c | 20 +++++++++++++++++---
|
|
hw/vfio/pci.h | 1 +
|
|
2 files changed, 18 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
|
|
index 7c998af..7c0d93a 100644
|
|
--- a/hw/vfio/pci.c
|
|
+++ b/hw/vfio/pci.c
|
|
@@ -36,11 +36,13 @@
|
|
#include "qapi/error.h"
|
|
|
|
#define MSIX_CAP_LENGTH 12
|
|
-#define MAX_DEV_ASSIGN_CMDLINE 32
|
|
|
|
#define TYPE_VFIO_PCI "vfio-pci"
|
|
#define PCI_VFIO(obj) OBJECT_CHECK(VFIOPCIDevice, obj, TYPE_VFIO_PCI)
|
|
|
|
+/* RHEL only: Set once for the first assigned dev */
|
|
+static uint16_t device_limit;
|
|
+
|
|
static void vfio_disable_interrupts(VFIOPCIDevice *vdev);
|
|
static void vfio_mmap_set_enabled(VFIOPCIDevice *vdev, bool enabled);
|
|
|
|
@@ -2810,15 +2812,24 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
|
|
int ret, i = 0;
|
|
bool is_mdev;
|
|
|
|
+ if (device_limit && device_limit != vdev->assigned_device_limit) {
|
|
+ error_setg(errp, "Assigned device limit has been redefined. "
|
|
+ "Old:%d, New:%d",
|
|
+ device_limit, vdev->assigned_device_limit);
|
|
+ return;
|
|
+ } else {
|
|
+ device_limit = vdev->assigned_device_limit;
|
|
+ }
|
|
+
|
|
QLIST_FOREACH(group, &vfio_group_list, next) {
|
|
QLIST_FOREACH(vbasedev_iter, &group->device_list, next) {
|
|
i++;
|
|
}
|
|
}
|
|
|
|
- if (i >= MAX_DEV_ASSIGN_CMDLINE) {
|
|
+ if (i >= vdev->assigned_device_limit) {
|
|
error_setg(errp, "Maximum supported vfio devices (%d) "
|
|
- "already attached", MAX_DEV_ASSIGN_CMDLINE);
|
|
+ "already attached", vdev->assigned_device_limit);
|
|
return;
|
|
}
|
|
|
|
@@ -3223,6 +3234,9 @@ static Property vfio_pci_dev_properties[] = {
|
|
DEFINE_PROP_BOOL("x-no-kvm-msix", VFIOPCIDevice, no_kvm_msix, false),
|
|
DEFINE_PROP_BOOL("x-no-geforce-quirks", VFIOPCIDevice,
|
|
no_geforce_quirks, false),
|
|
+ /* RHEL only */
|
|
+ DEFINE_PROP_UINT16("x-assigned-device-limit", VFIOPCIDevice,
|
|
+ assigned_device_limit, 64),
|
|
DEFINE_PROP_BOOL("x-no-kvm-ioeventfd", VFIOPCIDevice, no_kvm_ioeventfd,
|
|
false),
|
|
DEFINE_PROP_BOOL("x-no-vfio-ioeventfd", VFIOPCIDevice, no_vfio_ioeventfd,
|
|
diff --git a/hw/vfio/pci.h b/hw/vfio/pci.h
|
|
index c11c3f1..29a8add 100644
|
|
--- a/hw/vfio/pci.h
|
|
+++ b/hw/vfio/pci.h
|
|
@@ -136,6 +136,7 @@ typedef struct VFIOPCIDevice {
|
|
EventNotifier err_notifier;
|
|
EventNotifier req_notifier;
|
|
int (*resetfn)(struct VFIOPCIDevice *);
|
|
+ uint16_t assigned_device_limit;
|
|
uint32_t vendor_id;
|
|
uint32_t device_id;
|
|
uint32_t sub_vendor_id;
|
|
--
|
|
1.8.3.1
|
|
|