|
|
9ae3a8 |
From 53d1ae3ef3ed6959596813e75678fcb4f2aa30c0 Mon Sep 17 00:00:00 2001
|
|
|
9ae3a8 |
Message-Id: <53d1ae3ef3ed6959596813e75678fcb4f2aa30c0.1387382496.git.minovotn@redhat.com>
|
|
|
9ae3a8 |
In-Reply-To: <c5386144fbf09f628148101bc674e2421cdd16e3.1387382496.git.minovotn@redhat.com>
|
|
|
9ae3a8 |
References: <c5386144fbf09f628148101bc674e2421cdd16e3.1387382496.git.minovotn@redhat.com>
|
|
|
9ae3a8 |
From: Bandan Das <bsd@redhat.com>
|
|
|
9ae3a8 |
Date: Tue, 3 Dec 2013 20:05:12 +0100
|
|
|
9ae3a8 |
Subject: [PATCH 43/46] pci-assign: cap number of devices that can be assigned
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
RH-Author: Bandan Das <bsd@redhat.com>
|
|
|
9ae3a8 |
Message-id: <1386101113-31560-2-git-send-email-bsd@redhat.com>
|
|
|
9ae3a8 |
Patchwork-id: 55983
|
|
|
9ae3a8 |
O-Subject: [PATCH RHEL7 qemu-kvm v2 1/2] pci-assign: cap number of devices that can be assigned
|
|
|
9ae3a8 |
Bugzilla: 678368
|
|
|
9ae3a8 |
RH-Acked-by: Alex Williamson <alex.williamson@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: Marcelo Tosatti <mtosatti@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Legacy device assignment is not supported for RHEL7, nevertheless,
|
|
|
9ae3a8 |
it makes sense to enforce the limit here was well in case we need
|
|
|
9ae3a8 |
to support it in the future. Note that 8 is the limit enforced on
|
|
|
9ae3a8 |
RHEL 6, RHEL 5 too has a static limit of 8 assigned devices.
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Signed-off-by: Bandan Das <bsd@redhat.com>
|
|
|
9ae3a8 |
---
|
|
|
9ae3a8 |
hw/i386/kvm/pci-assign.c | 19 ++++++++++++++++++-
|
|
|
9ae3a8 |
1 file changed, 18 insertions(+), 1 deletion(-)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Signed-off-by: Michal Novotny <minovotn@redhat.com>
|
|
|
9ae3a8 |
---
|
|
|
9ae3a8 |
hw/i386/kvm/pci-assign.c | 19 ++++++++++++++++++-
|
|
|
9ae3a8 |
1 file changed, 18 insertions(+), 1 deletion(-)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
diff --git a/hw/i386/kvm/pci-assign.c b/hw/i386/kvm/pci-assign.c
|
|
|
9ae3a8 |
index 7060605..4a05c0f 100644
|
|
|
9ae3a8 |
--- a/hw/i386/kvm/pci-assign.c
|
|
|
9ae3a8 |
+++ b/hw/i386/kvm/pci-assign.c
|
|
|
9ae3a8 |
@@ -139,8 +139,12 @@ typedef struct AssignedDevice {
|
|
|
9ae3a8 |
MemoryRegion mmio;
|
|
|
9ae3a8 |
char *configfd_name;
|
|
|
9ae3a8 |
int32_t bootindex;
|
|
|
9ae3a8 |
+ QLIST_ENTRY(AssignedDevice) next;
|
|
|
9ae3a8 |
} AssignedDevice;
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
+#define MAX_DEV_ASSIGN_CMDLINE 8
|
|
|
9ae3a8 |
+static QLIST_HEAD(, AssignedDevice) devs = QLIST_HEAD_INITIALIZER(devs);
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
static void assigned_dev_update_irq_routing(PCIDevice *dev);
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
static void assigned_dev_load_option_rom(AssignedDevice *dev);
|
|
|
9ae3a8 |
@@ -1733,14 +1737,25 @@ static void reset_assigned_device(DeviceState *dev)
|
|
|
9ae3a8 |
static int assigned_initfn(struct PCIDevice *pci_dev)
|
|
|
9ae3a8 |
{
|
|
|
9ae3a8 |
AssignedDevice *dev = DO_UPCAST(AssignedDevice, dev, pci_dev);
|
|
|
9ae3a8 |
+ AssignedDevice *adev;
|
|
|
9ae3a8 |
uint8_t e_intx;
|
|
|
9ae3a8 |
- int r;
|
|
|
9ae3a8 |
+ int r, i = 0;
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
if (!kvm_enabled()) {
|
|
|
9ae3a8 |
error_report("pci-assign: error: requires KVM support");
|
|
|
9ae3a8 |
return -1;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
+ QLIST_FOREACH(adev, &devs, next) {
|
|
|
9ae3a8 |
+ i++;
|
|
|
9ae3a8 |
+ }
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
+ if (i >= MAX_DEV_ASSIGN_CMDLINE) {
|
|
|
9ae3a8 |
+ error_report("pci-assign: Maximum supported assigned devices (%d) "
|
|
|
9ae3a8 |
+ "already attached\n", MAX_DEV_ASSIGN_CMDLINE);
|
|
|
9ae3a8 |
+ return -1;
|
|
|
9ae3a8 |
+ }
|
|
|
9ae3a8 |
+
|
|
|
9ae3a8 |
if (!dev->host.domain && !dev->host.bus && !dev->host.slot &&
|
|
|
9ae3a8 |
!dev->host.function) {
|
|
|
9ae3a8 |
error_report("pci-assign: error: no host device specified");
|
|
|
9ae3a8 |
@@ -1810,6 +1825,7 @@ static int assigned_initfn(struct PCIDevice *pci_dev)
|
|
|
9ae3a8 |
goto assigned_out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
+ QLIST_INSERT_HEAD(&devs, dev, next);
|
|
|
9ae3a8 |
assigned_dev_load_option_rom(dev);
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
add_boot_device_path(dev->bootindex, &pci_dev->qdev, NULL);
|
|
|
9ae3a8 |
@@ -1827,6 +1843,7 @@ static void assigned_exitfn(struct PCIDevice *pci_dev)
|
|
|
9ae3a8 |
{
|
|
|
9ae3a8 |
AssignedDevice *dev = DO_UPCAST(AssignedDevice, dev, pci_dev);
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
+ QLIST_REMOVE(dev, next);
|
|
|
9ae3a8 |
deassign_device(dev);
|
|
|
9ae3a8 |
free_assigned_device(dev);
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
--
|
|
|
9ae3a8 |
1.7.11.7
|
|
|
9ae3a8 |
|