On Tue, 15 Sep 2020 10:16:23 -0400 Matthew Rosato <mjros...@linux.ibm.com> wrote:
> On 9/15/20 7:28 AM, Cornelia Huck wrote: > > On Mon, 14 Sep 2020 18:29:29 -0400 > > Matthew Rosato <mjros...@linux.ibm.com> wrote: > > > >> When an s390 guest is using lazy unmapping, it can result in a very > >> large number of oustanding DMA requests, far beyond the default > >> limit configured for vfio. Let's track DMA usage similar to vfio > >> in the host, and trigger the guest to flush their DMA mappings > >> before vfio runs out. > >> > >> Signed-off-by: Matthew Rosato <mjros...@linux.ibm.com> > >> --- > >> hw/s390x/s390-pci-bus.c | 99 > >> +++++++++++++++++++++++++++++++++++++++++++++--- > >> hw/s390x/s390-pci-bus.h | 9 +++++ > >> hw/s390x/s390-pci-inst.c | 29 +++++++++++--- > >> hw/s390x/s390-pci-inst.h | 3 ++ > >> 4 files changed, 129 insertions(+), 11 deletions(-) > >> > > > > (...) > > > >> @@ -737,6 +742,82 @@ static void s390_pci_iommu_free(S390pciState *s, > >> PCIBus *bus, int32_t devfn) > >> object_unref(OBJECT(iommu)); > >> } > >> > >> +static bool s390_sync_dma_avail(int fd, unsigned int *avail) > > > > Not sure I like the name. It sounds like the function checks whether > > "sync dma" is available. Maybe s390_update_dma_avail()? > > > > Sounds fine to me. > > >> +{ > >> + struct vfio_iommu_type1_info *info; > >> + uint32_t argsz; > >> + bool rval = false; > >> + int ret; > >> + > >> + if (avail == NULL) { > >> + return false; > >> + } > >> + > >> + argsz = sizeof(struct vfio_iommu_type1_info); > >> + info = g_malloc0(argsz); > >> + info->argsz = argsz; > >> + /* > >> + * If the specified argsz is not large enough to contain all > >> + * capabilities it will be updated upon return. In this case > >> + * use the updated value to get the entire capability chain. > >> + */ > >> + ret = ioctl(fd, VFIO_IOMMU_GET_INFO, info); > >> + if (argsz != info->argsz) { > >> + argsz = info->argsz; > >> + info = g_realloc(info, argsz); > >> + info->argsz = argsz; > >> + ret = ioctl(fd, VFIO_IOMMU_GET_INFO, info); > >> + } > >> + > >> + if (ret) { > >> + goto out; > >> + } > >> + > >> + /* If the capability exists, update with the current value */ > >> + rval = vfio_get_info_dma_avail(info, avail); > > > > Adding vfio specific things into the generic s390 pci emulation code > > looks a bit ugly... I'd prefer to factor that out into a separate file, > > especially if you plan to add more vfio-specific things in the future. > > > > Fair. hw/s390x/s390-pci-vfio.* ? Sounds good to me.