[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH v4 02/12] vfio: Create VFIOAddressSpace objects as nee
From: |
Alexey Kardashevskiy |
Subject: |
[Qemu-ppc] [PATCH v4 02/12] vfio: Create VFIOAddressSpace objects as needed |
Date: |
Fri, 30 Aug 2013 20:15:28 +1000 |
From: David Gibson <address@hidden>
So far, VFIO has a notion of different logical DMA address spaces, but
only ever uses one (system memory). This patch extends this, creating
new VFIOAddressSpace objects as necessary, according to the AddressSpace
reported by the PCI subsystem for this device's DMAs.
This isn't enough yet to support guest side IOMMUs with VFIO, but it does
mean we could now support VFIO devices on, for example, a guest side PCI
host bridge which maps system memory at somewhere other than 0 in PCI
space.
Signed-off-by: David Gibson <address@hidden>
Signed-off-by: Alexey Kardashevskiy <address@hidden>
---
hw/misc/vfio.c | 43 +++++++++++++++++++++++++++++++++++--------
1 file changed, 35 insertions(+), 8 deletions(-)
diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
index 93a316e..c16f41b 100644
--- a/hw/misc/vfio.c
+++ b/hw/misc/vfio.c
@@ -133,9 +133,10 @@ enum {
typedef struct VFIOAddressSpace {
AddressSpace *as;
QLIST_HEAD(, VFIOContainer) containers;
+ QLIST_ENTRY(VFIOAddressSpace) list;
} VFIOAddressSpace;
-static VFIOAddressSpace vfio_address_space_memory;
+QLIST_HEAD(, VFIOAddressSpace) vfio_address_spaces;
struct VFIOGroup;
@@ -2611,10 +2612,34 @@ static int vfio_load_rom(VFIODevice *vdev)
return 0;
}
-static void vfio_address_space_init(VFIOAddressSpace *space, AddressSpace *as)
+static VFIOAddressSpace *vfio_get_address_space(AddressSpace *as)
{
+ VFIOAddressSpace *space;
+
+ QLIST_FOREACH(space, &vfio_address_spaces, list) {
+ if (space->as == as) {
+ return space;
+ }
+ }
+
+ /* No suitable VFIOAddressSpace, create a new one */
+ space = g_malloc0(sizeof(*space));
space->as = as;
QLIST_INIT(&space->containers);
+
+ QLIST_INSERT_HEAD(&vfio_address_spaces, space, list);
+
+ return space;
+}
+
+static void vfio_put_address_space(VFIOAddressSpace *space)
+{
+ if (!QLIST_EMPTY(&space->containers)) {
+ return;
+ }
+
+ QLIST_REMOVE(space, list);
+ g_free(space);
}
static int vfio_connect_container(VFIOGroup *group, VFIOAddressSpace *space)
@@ -2699,6 +2724,8 @@ static void vfio_disconnect_container(VFIOGroup *group)
group->container = NULL;
if (QLIST_EMPTY(&container->group_list)) {
+ VFIOAddressSpace *space = container->space;
+
if (container->iommu_data.release) {
container->iommu_data.release(container);
}
@@ -2706,6 +2733,8 @@ static void vfio_disconnect_container(VFIOGroup *group)
DPRINTF("vfio_disconnect_container: close container->fd\n");
close(container->fd);
g_free(container);
+
+ vfio_put_address_space(space);
}
}
@@ -3076,6 +3105,7 @@ static int vfio_initfn(PCIDevice *pdev)
{
VFIODevice *pvdev, *vdev = DO_UPCAST(VFIODevice, pdev, pdev);
VFIOGroup *group;
+ VFIOAddressSpace *space;
char path[PATH_MAX], iommu_group_path[PATH_MAX], *group_name;
ssize_t len;
struct stat st;
@@ -3111,14 +3141,12 @@ static int vfio_initfn(PCIDevice *pdev)
DPRINTF("%s(%04x:%02x:%02x.%x) group %d\n", __func__, vdev->host.domain,
vdev->host.bus, vdev->host.slot, vdev->host.function, groupid);
- if (pci_device_iommu_address_space(pdev) != &address_space_memory) {
- error_report("vfio: DMA address space must be system memory");
- return -EINVAL;
- }
+ space = vfio_get_address_space(pci_device_iommu_address_space(pdev));
- group = vfio_get_group(groupid, &vfio_address_space_memory);
+ group = vfio_get_group(groupid, space);
if (!group) {
error_report("vfio: failed to get group %d", groupid);
+ vfio_put_address_space(space);
return -ENOENT;
}
@@ -3339,7 +3367,6 @@ static const TypeInfo vfio_pci_dev_info = {
static void register_vfio_pci_dev_type(void)
{
- vfio_address_space_init(&vfio_address_space_memory, &address_space_memory);
type_register_static(&vfio_pci_dev_info);
}
--
1.8.4.rc4
- [Qemu-ppc] [PATCH v4 00/12] vfio on spapr-ppc64, Alexey Kardashevskiy, 2013/08/30
- [Qemu-ppc] [PATCH v4 06/12] spapr_pci: add spapr_pci trace, Alexey Kardashevskiy, 2013/08/30
- [Qemu-ppc] [PATCH v4 09/12] spapr_iommu: add SPAPR VFIO IOMMU, Alexey Kardashevskiy, 2013/08/30
- [Qemu-ppc] [PATCH v4 04/12] spapr vfio: add vfio_container_spapr_get_info(), Alexey Kardashevskiy, 2013/08/30
- [Qemu-ppc] [PATCH v4 10/12] spapr vfio: add spapr-pci-vfio-host-bridge to support vfio, Alexey Kardashevskiy, 2013/08/30
- [Qemu-ppc] [PATCH v4 08/12] spapr_iommu: introduce SPAPR_TCE_TABLE class, Alexey Kardashevskiy, 2013/08/30
- [Qemu-ppc] [PATCH v4 05/12] spapr_pci: convert init to realize, Alexey Kardashevskiy, 2013/08/30
- [Qemu-ppc] [PATCH v4 07/12] spapr_pci: converts fprintf to error_report, Alexey Kardashevskiy, 2013/08/30
- [Qemu-ppc] [PATCH v4 02/12] vfio: Create VFIOAddressSpace objects as needed,
Alexey Kardashevskiy <=
- [Qemu-ppc] [PATCH v4 11/12] spapr vfio: enable for spapr, Alexey Kardashevskiy, 2013/08/30
- [Qemu-ppc] [PATCH v4 03/12] vfio: Add guest side IOMMU support, Alexey Kardashevskiy, 2013/08/30
- [Qemu-ppc] [PATCH v4 01/12] vfio: Introduce VFIO address spaces, Alexey Kardashevskiy, 2013/08/30
- [Qemu-ppc] [PATCH v4 12/12] spapr kvm vfio: enable in-kernel acceleration, Alexey Kardashevskiy, 2013/08/30