[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH qemu RFC 1/7] vfio/spapr: Fix indirect levels calculat
From: |
Alexey Kardashevskiy |
Subject: |
[Qemu-ppc] [PATCH qemu RFC 1/7] vfio/spapr: Fix indirect levels calculation |
Date: |
Tue, 13 Nov 2018 19:30:58 +1100 |
The current code assumes that we can address more bits on a PCI bus
for DMA than we really can. Limit to the known tested maximum of 55 bits
and assume 64K IOMMU pages.
Signed-off-by: Alexey Kardashevskiy <address@hidden>
---
hw/vfio/spapr.c | 3 ++-
hw/vfio/trace-events | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/hw/vfio/spapr.c b/hw/vfio/spapr.c
index becf71a..f5fdc53 100644
--- a/hw/vfio/spapr.c
+++ b/hw/vfio/spapr.c
@@ -183,7 +183,7 @@ int vfio_spapr_create_window(VFIOContainer *container,
entries = create.window_size >> create.page_shift;
pages = MAX((entries * sizeof(uint64_t)) / getpagesize(), 1);
pages = MAX(pow2ceil(pages), 1); /* Round up */
- create.levels = ctz64(pages) / 6 + 1;
+ create.levels = MAX(1, (55 - create.page_shift) / 16);
ret = ioctl(container->fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create);
if (ret) {
@@ -200,6 +200,7 @@ int vfio_spapr_create_window(VFIOContainer *container,
return -EINVAL;
}
trace_vfio_spapr_create_window(create.page_shift,
+ create.levels,
create.window_size,
create.start_addr);
*pgsize = pagesize;
diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events
index a85e866..db730f3 100644
--- a/hw/vfio/trace-events
+++ b/hw/vfio/trace-events
@@ -128,6 +128,6 @@ vfio_prereg_listener_region_add_skip(uint64_t start,
uint64_t end) "0x%"PRIx64"
vfio_prereg_listener_region_del_skip(uint64_t start, uint64_t end)
"0x%"PRIx64" - 0x%"PRIx64
vfio_prereg_register(uint64_t va, uint64_t size, int ret) "va=0x%"PRIx64"
size=0x%"PRIx64" ret=%d"
vfio_prereg_unregister(uint64_t va, uint64_t size, int ret) "va=0x%"PRIx64"
size=0x%"PRIx64" ret=%d"
-vfio_spapr_create_window(int ps, uint64_t ws, uint64_t off) "pageshift=0x%x
winsize=0x%"PRIx64" offset=0x%"PRIx64
+vfio_spapr_create_window(int ps, unsigned int levels, uint64_t ws, uint64_t
off) "pageshift=0x%x levels=%u winsize=0x%"PRIx64" offset=0x%"PRIx64
vfio_spapr_remove_window(uint64_t off) "offset=0x%"PRIx64
vfio_spapr_group_attach(int groupfd, int tablefd) "Attached groupfd %d to
liobn fd %d"
--
2.17.1
- [Qemu-ppc] [PATCH qemu RFC 0/7] spapr_pci, vfio: NVIDIA V100 + P9 passthrough, Alexey Kardashevskiy, 2018/11/13
- [Qemu-ppc] [PATCH qemu RFC 4/7] vfio/nvidia-v100: Disable VBIOS update, Alexey Kardashevskiy, 2018/11/13
- [Qemu-ppc] [PATCH qemu RFC 3/7] pci: Move NVIDIA vendor id to the rest of ids, Alexey Kardashevskiy, 2018/11/13
- [Qemu-ppc] [PATCH qemu RFC 1/7] vfio/spapr: Fix indirect levels calculation,
Alexey Kardashevskiy <=
- [Qemu-ppc] [PATCH qemu RFC 7/7] spapr: Add NVLink2 pass through support, Alexey Kardashevskiy, 2018/11/13
- [Qemu-ppc] [PATCH qemu RFC 2/7] linux-header: Update for new capabilities, Alexey Kardashevskiy, 2018/11/13
- [Qemu-ppc] [PATCH qemu RFC 6/7] vfio: Make vfio_get_region_info_cap public, Alexey Kardashevskiy, 2018/11/13