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