[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 06/21] spapr_iommu: Provide a function to switch a TC
From: |
David Gibson |
Subject: |
[Qemu-devel] [PULL 06/21] spapr_iommu: Provide a function to switch a TCE table to allowing VFIO |
Date: |
Fri, 23 Oct 2015 20:43:18 +1100 |
Because of the way non-VFIO guest IOMMU operations are KVM accelerated, not
all TCE tables (guest IOMMU contexts) can support VFIO devices. Currently,
this is decided at creation time.
To support hotplug of VFIO devices, we need to allow a TCE table which
previously didn't allow VFIO devices to be switched so that it can. This
patch adds an spapr_tce_set_need_vfio() function to do this, by
reallocating the table in userspace if necessary.
Currently this doesn't allow the KVM acceleration to be re-enabled if all
the VFIO devices are removed. That's an optimization for another time.
Signed-off-by: David Gibson <address@hidden>
Reviewed-by: Laurent Vivier <address@hidden>
---
hw/ppc/spapr_iommu.c | 32 ++++++++++++++++++++++++++++++++
include/hw/ppc/spapr.h | 2 ++
2 files changed, 34 insertions(+)
diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
index 5166cde..ed28565 100644
--- a/hw/ppc/spapr_iommu.c
+++ b/hw/ppc/spapr_iommu.c
@@ -168,6 +168,38 @@ static int spapr_tce_table_realize(DeviceState *dev)
return 0;
}
+void spapr_tce_set_need_vfio(sPAPRTCETable *tcet, bool need_vfio)
+{
+ size_t table_size = tcet->nb_table * sizeof(uint64_t);
+ void *newtable;
+
+ if (need_vfio == tcet->need_vfio) {
+ /* Nothing to do */
+ return;
+ }
+
+ if (!need_vfio) {
+ /* FIXME: We don't support transition back to KVM accelerated
+ * TCEs yet */
+ return;
+ }
+
+ tcet->need_vfio = true;
+
+ if (tcet->fd < 0) {
+ /* Table is already in userspace, nothing to be do */
+ return;
+ }
+
+ newtable = g_malloc(table_size);
+ memcpy(newtable, tcet->table, table_size);
+
+ kvmppc_remove_spapr_tce(tcet->table, tcet->fd, tcet->nb_table);
+
+ tcet->fd = -1;
+ tcet->table = newtable;
+}
+
sPAPRTCETable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn,
uint64_t bus_offset,
uint32_t page_shift,
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 27d65d5..5baa906 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -589,6 +589,8 @@ sPAPRTCETable *spapr_tce_new_table(DeviceState *owner,
uint32_t liobn,
uint32_t page_shift,
uint32_t nb_table,
bool need_vfio);
+void spapr_tce_set_need_vfio(sPAPRTCETable *tcet, bool need_vfio);
+
MemoryRegion *spapr_tce_get_iommu(sPAPRTCETable *tcet);
int spapr_dma_dt(void *fdt, int node_off, const char *propname,
uint32_t liobn, uint64_t window, uint32_t size);
--
2.4.3
- [Qemu-devel] [PULL 03/21] spapr: Add "slb-size" property to CPU device tree nodes, (continued)
- [Qemu-devel] [PULL 03/21] spapr: Add "slb-size" property to CPU device tree nodes, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 13/21] escc: add to input category, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 12/21] cmd646: add to storage category, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 11/21] adb: add to input category, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 14/21] grackle: add to bridge category, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 08/21] hw/scsi/spapr_vscsi: Remove superfluous memset, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 04/21] spapr_pci: Allow PCI host bridge DMA window to be configured, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 07/21] spapr_pci: Allow VFIO devices to work on the normal PCI host bridge, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 01/21] spapr: Allocate HTAB from machine init, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 02/21] spapr: Abort when HTAB of requested size isn't allocated, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 06/21] spapr_iommu: Provide a function to switch a TCE table to allowing VFIO,
David Gibson <=
- [Qemu-devel] [PULL 16/21] macio-ide: add to storage category, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 19/21] macio-nvram: add to misc category, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 18/21] macio: add to bridge category, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 15/21] cuda: add to bridge category, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 17/21] uninorth: add to bridge category, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 10/21] ppc/spapr: Add "ibm, pa-features" property to the device-tree, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 20/21] openpic: add to misc category, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 21/21] prep: do not use CPU_LOG_IOPORT, convert to tracepoints, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 09/21] ppc: Add mmu_model defines for arch 2.03 and 2.07, David Gibson, 2015/10/23
- [Qemu-devel] [PULL 05/21] spapr_iommu: Rename vfio_accel parameter, David Gibson, 2015/10/23