On Wed, 16 Sep 2020 09:21:39 +0200 Philippe Mathieu-Daudé <philmd@xxxxxxxxxx> wrote: > On 9/15/20 9:14 PM, Matthew Rosato wrote: > > Create new files for separating out vfio-specific work for s390 > > pci. Add the first such routine, which issues VFIO_IOMMU_GET_INFO > > ioctl to collect the current dma available count. > > > > Signed-off-by: Matthew Rosato <mjrosato@xxxxxxxxxxxxx> > > --- > > hw/s390x/meson.build | 1 + > > hw/s390x/s390-pci-vfio.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ > > hw/s390x/s390-pci-vfio.h | 17 +++++++++++++++ > > 3 files changed, 72 insertions(+) > > create mode 100644 hw/s390x/s390-pci-vfio.c > > create mode 100644 hw/s390x/s390-pci-vfio.h > > (...) > > diff --git a/hw/s390x/s390-pci-vfio.c b/hw/s390x/s390-pci-vfio.c > > new file mode 100644 > > index 0000000..75e3ac1 > > --- /dev/null > > +++ b/hw/s390x/s390-pci-vfio.c > > @@ -0,0 +1,54 @@ > > +/* > > + * s390 vfio-pci interfaces > > + * > > + * Copyright 2020 IBM Corp. > > + * Author(s): Matthew Rosato <mjrosato@xxxxxxxxxxxxx> > > + * > > + * This work is licensed under the terms of the GNU GPL, version 2 or (at > > + * your option) any later version. See the COPYING file in the top-level > > + * directory. > > + */ > > + > > +#include <sys/ioctl.h> > > + > > +#include "qemu/osdep.h" > > +#include "s390-pci-vfio.h" > > +#include "hw/vfio/vfio-common.h" > > + > > +/* > > + * Get the current DMA available count from vfio. Returns true if vfio is > > + * limiting DMA requests, false otherwise. The current available count read > > + * from vfio is returned in avail. > > + */ > > +bool s390_pci_update_dma_avail(int fd, unsigned int *avail) > > +{ > > + g_autofree struct vfio_iommu_type1_info *info; > > + uint32_t argsz; > > + int ret; > > + > > + assert(avail); > > + > > + 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); > > Do we need to bzero [sizeof(struct vfio_iommu_type1_info)..argsz[? If we do, I think we need to do the equivalent in vfio_get_region_info() as well? (Also, shouldn't we check ret before looking at info->argsz?) > > > + info->argsz = argsz; > > + ret = ioctl(fd, VFIO_IOMMU_GET_INFO, info); > > + } > > + > > + if (ret) { > > + return false; > > + } > > + > > + /* If the capability exists, update with the current value */ > > + return vfio_get_info_dma_avail(info, avail); > > +} > > + (...)