From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57390) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ani3A-00050d-1x for qemu-devel@nongnu.org; Wed, 06 Apr 2016 03:38:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ani38-0000ce-4i for qemu-devel@nongnu.org; Wed, 06 Apr 2016 03:38:51 -0400 Date: Wed, 6 Apr 2016 17:10:24 +1000 From: David Gibson Message-ID: <20160406071024.GC16485@voom.fritz.box> References: <1459762426-18440-1-git-send-email-aik@ozlabs.ru> <1459762426-18440-14-git-send-email-aik@ozlabs.ru> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="PYvLm/IFaQmMAfx6" Content-Disposition: inline In-Reply-To: <1459762426-18440-14-git-send-email-aik@ozlabs.ru> Subject: Re: [Qemu-devel] [PATCH qemu v15 13/17] vfio: Add host side DMA window capabilities List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexey Kardashevskiy Cc: Alex Williamson , qemu-ppc@nongnu.org, qemu-devel@nongnu.org, Alexander Graf --PYvLm/IFaQmMAfx6 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Apr 04, 2016 at 07:33:42PM +1000, Alexey Kardashevskiy wrote: > There are going to be multiple IOMMUs per a container. This moves > the single host IOMMU parameter set to a list of VFIOHostIOMMU. ^^^ Haven't updated your commit message for the structure name change. > This should cause no behavioral change and will be used later by > the SPAPR TCE IOMMU v2 which will also add a vfio_host_iommu_del() helper. >=20 > Signed-off-by: Alexey Kardashevskiy Apart from that, Reviewed-by: David Gibson > --- > Changes: > v15: > * s/vfio_host_iommu_add/vfio_host_win_add/ > * s/VFIOHostIOMMU/VFIOHostDMAWindow/ > --- > hw/vfio/common.c | 65 +++++++++++++++++++++++++++++++++----= ------ > include/hw/vfio/vfio-common.h | 9 ++++-- > 2 files changed, 57 insertions(+), 17 deletions(-) >=20 > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index 3e9c579..ea79311 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -29,6 +29,7 @@ > #include "exec/memory.h" > #include "hw/hw.h" > #include "qemu/error-report.h" > +#include "qemu/range.h" > #include "sysemu/kvm.h" > #include "trace.h" > =20 > @@ -239,6 +240,45 @@ static int vfio_dma_map(VFIOContainer *container, hw= addr iova, > return -errno; > } > =20 > +static VFIOHostDMAWindow *vfio_host_win_lookup(VFIOContainer *container, > + hwaddr min_iova, hwaddr m= ax_iova) > +{ > + VFIOHostDMAWindow *hostwin; > + > + QLIST_FOREACH(hostwin, &container->hiommu_list, hiommu_next) { > + if (hostwin->min_iova <=3D min_iova && max_iova <=3D hostwin->ma= x_iova) { > + return hostwin; > + } > + } > + > + return NULL; > +} > + > +static int vfio_host_win_add(VFIOContainer *container, > + hwaddr min_iova, hwaddr max_iova, > + uint64_t iova_pgsizes) > +{ > + VFIOHostDMAWindow *hostwin; > + > + QLIST_FOREACH(hostwin, &container->hiommu_list, hiommu_next) { > + if (ranges_overlap(min_iova, max_iova - min_iova + 1, > + hostwin->min_iova, > + hostwin->max_iova - hostwin->min_iova + 1)) { > + error_report("%s: Overlapped IOMMU are not enabled", __func_= _); > + return -1; > + } > + } > + > + hostwin =3D g_malloc0(sizeof(*hostwin)); > + > + hostwin->min_iova =3D min_iova; > + hostwin->max_iova =3D max_iova; > + hostwin->iova_pgsizes =3D iova_pgsizes; > + QLIST_INSERT_HEAD(&container->hiommu_list, hostwin, hiommu_next); > + > + return 0; > +} > + > static bool vfio_listener_skipped_section(MemoryRegionSection *section) > { > return (!memory_region_is_ram(section->mr) && > @@ -352,7 +392,7 @@ static void vfio_listener_region_add(MemoryListener *= listener, > } > end =3D int128_get64(llend); > =20 > - if ((iova < container->min_iova) || ((end - 1) > container->max_iova= )) { > + if (!vfio_host_win_lookup(container, iova, end - 1)) { > error_report("vfio: IOMMU container %p can't map guest IOVA regi= on" > " 0x%"HWADDR_PRIx"..0x%"HWADDR_PRIx, > container, iova, end - 1); > @@ -367,10 +407,6 @@ static void vfio_listener_region_add(MemoryListener = *listener, > =20 > trace_vfio_listener_region_add_iommu(iova, end - 1); > /* > - * FIXME: We should do some checking to see if the > - * capabilities of the host VFIO IOMMU are adequate to model > - * the guest IOMMU > - * > * FIXME: For VFIO iommu types which have KVM acceleration to > * avoid bouncing all map/unmaps through qemu this way, this > * would be the right place to wire that up (tell the KVM > @@ -818,16 +854,14 @@ static int vfio_connect_container(VFIOGroup *group,= AddressSpace *as) > * existing Type1 IOMMUs generally support any IOVA we're > * going to actually try in practice. > */ > - container->min_iova =3D 0; > - container->max_iova =3D (hwaddr)-1; > - > - /* Assume just 4K IOVA page size */ > - container->iova_pgsizes =3D 0x1000; > info.argsz =3D sizeof(info); > ret =3D ioctl(fd, VFIO_IOMMU_GET_INFO, &info); > /* Ignore errors */ > if ((ret =3D=3D 0) && (info.flags & VFIO_IOMMU_INFO_PGSIZES)) { > - container->iova_pgsizes =3D info.iova_pgsizes; > + vfio_host_win_add(container, 0, (hwaddr)-1, info.iova_pgsize= s); > + } else { > + /* Assume just 4K IOVA page size */ > + vfio_host_win_add(container, 0, (hwaddr)-1, 0x1000); > } > } else if (ioctl(fd, VFIO_CHECK_EXTENSION, VFIO_SPAPR_TCE_IOMMU) || > ioctl(fd, VFIO_CHECK_EXTENSION, VFIO_SPAPR_TCE_v2_IOMMU))= { > @@ -884,11 +918,12 @@ static int vfio_connect_container(VFIOGroup *group,= AddressSpace *as) > ret =3D -errno; > goto listener_release_exit; > } > - container->min_iova =3D info.dma32_window_start; > - container->max_iova =3D container->min_iova + info.dma32_window_= size - 1; > =20 > - /* Assume just 4K IOVA pages for now */ > - container->iova_pgsizes =3D 0x1000; > + /* The default table uses 4K pages */ > + vfio_host_win_add(container, info.dma32_window_start, > + info.dma32_window_start + > + info.dma32_window_size - 1, > + 0x1000); > } else { > error_report("vfio: No available IOMMU models"); > ret =3D -EINVAL; > diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h > index c72e45a..8028bb8 100644 > --- a/include/hw/vfio/vfio-common.h > +++ b/include/hw/vfio/vfio-common.h > @@ -82,9 +82,8 @@ typedef struct VFIOContainer { > * contiguous IOVA window. We may need to generalize that in > * future > */ > - hwaddr min_iova, max_iova; > - uint64_t iova_pgsizes; > QLIST_HEAD(, VFIOGuestIOMMU) giommu_list; > + QLIST_HEAD(, VFIOHostDMAWindow) hiommu_list; > QLIST_HEAD(, VFIOGroup) group_list; > QLIST_ENTRY(VFIOContainer) next; > } VFIOContainer; > @@ -97,6 +96,12 @@ typedef struct VFIOGuestIOMMU { > QLIST_ENTRY(VFIOGuestIOMMU) giommu_next; > } VFIOGuestIOMMU; > =20 > +typedef struct VFIOHostDMAWindow { > + hwaddr min_iova, max_iova; > + uint64_t iova_pgsizes; > + QLIST_ENTRY(VFIOHostDMAWindow) hiommu_next; > +} VFIOHostDMAWindow; > + > typedef struct VFIODeviceOps VFIODeviceOps; > =20 > typedef struct VFIODevice { --=20 David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson --PYvLm/IFaQmMAfx6 Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXBLZgAAoJEGw4ysog2bOSOloQANxpLgQ0P3cy3GkyS/WIbUI+ kMGRP/q25VTDe+yW6fl/oRg8DevIssfVBgBLYott/KVrzFhLvUiuUVIEW2J8zj9h k4V5e9M9ECCfY8+dbjUBah8px7O5sZLsCb3NVxbbcWDWPGLEJkrD+WFhRi3vi6vx 4xtc7dr+MqGSJmFXZwPx6uPLXcEk+9YD6xJep/1ZfZEvwUUJCtNjToGMAltiU+0E kxN00pKwp04CrUaZwGc0iO9D8EHtjIK5h61nFGFZp4jFlSMvk4fe8Gua/V+apJyc pD7e0fwEQyL8DfHSEPCpYfqPIfL74lwrQrwYV3Da8ZcMWcoKQdjkLqmVh91/eGDZ kcYOS1YdO/Rduc7OjOF+ImSv7I3Ew31bwLXYLClSUq7oDseV9Ejcj4ENL288saq2 Tq96wQVPJeXk0MKVZ3pwKG7kkQQJ1JIVial0GmclWEr0KOSlMUPOJuoSnqN5YVBF wrnibB7evCUhMIacQwQshnSY/G2UPpcPsKwlW9kjI1QmFx/XK0xqeF90lpaCCLhU SN4qpoTqS6gWBCRxDfA2nkjhK9Vdlvf2Pw1OkwsKn6qTegqpPRGBejJ1WKBz8T0F PFxi0Zp+bA0Prmnkawhu8+9qInmxkfy/0jxUD318hcD9d6/R+EEYhla+Qpx1RloJ 45qVA3e8jp5H3qlhccK9 =VQNm -----END PGP SIGNATURE----- --PYvLm/IFaQmMAfx6--