From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48065) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1abIT1-00064S-Vv for qemu-devel@nongnu.org; Wed, 02 Mar 2016 20:54:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1abIT0-0005AG-Oq for qemu-devel@nongnu.org; Wed, 02 Mar 2016 20:54:15 -0500 Date: Thu, 3 Mar 2016 12:34:48 +1100 From: David Gibson Message-ID: <20160303013448.GC1620@voom.redhat.com> References: <1456823441-46757-1-git-send-email-aik@ozlabs.ru> <1456823441-46757-2-git-send-email-aik@ozlabs.ru> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="xo44VMWPx7vlQ2+2" Content-Disposition: inline In-Reply-To: <1456823441-46757-2-git-send-email-aik@ozlabs.ru> Subject: Re: [Qemu-devel] [Qemu-ppc] [PATCH qemu v13 01/16] memory: Fix IOMMU replay base address 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 --xo44VMWPx7vlQ2+2 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Mar 01, 2016 at 08:10:26PM +1100, Alexey Kardashevskiy wrote: > Since a788f227 "memory: Allow replay of IOMMU mapping notifications" > when new VFIO listener is added, all existing IOMMU mappings are > replayed. However there is a problem that the base address of > an IOMMU memory region (IOMMU MR) is ignored which is not a problem > for the existing user (which is pseries) with its default 32bit DMA > window starting at 0 but it is if there is another DMA window. >=20 > This stores the IOMMU's offset_within_address_space and adjusts > the IOVA before calling vfio_dma_map/vfio_dma_unmap. >=20 > As the IOMMU notifier expects IOVA offset rather than the absolute > address, this also adjusts IOVA in sPAPR H_PUT_TCE handler before > calling notifier(s). >=20 > Signed-off-by: Alexey Kardashevskiy Reviewed-by: David Gibson It's not worth reworking just for this, but it might be slightly preferable for merge purposes to split out the fix to put_tce_emu (spapr code) away from the other changes (vfio code). > --- > hw/ppc/spapr_iommu.c | 2 +- > hw/vfio/common.c | 14 ++++++++------ > include/hw/vfio/vfio-common.h | 1 + > 3 files changed, 10 insertions(+), 7 deletions(-) >=20 > diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c > index 7dd4588..277f289 100644 > --- a/hw/ppc/spapr_iommu.c > +++ b/hw/ppc/spapr_iommu.c > @@ -277,7 +277,7 @@ static target_ulong put_tce_emu(sPAPRTCETable *tcet, = target_ulong ioba, > tcet->table[index] =3D tce; > =20 > entry.target_as =3D &address_space_memory, > - entry.iova =3D ioba & page_mask; > + entry.iova =3D (ioba - tcet->bus_offset) & page_mask; > entry.translated_addr =3D tce & page_mask; > entry.addr_mask =3D ~page_mask; > entry.perm =3D spapr_tce_iommu_access_flags(tce); > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index 55e87d3..9bf4c3b 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -257,14 +257,14 @@ static void vfio_iommu_map_notify(Notifier *n, void= *data) > VFIOGuestIOMMU *giommu =3D container_of(n, VFIOGuestIOMMU, n); > VFIOContainer *container =3D giommu->container; > IOMMUTLBEntry *iotlb =3D data; > + hwaddr iova =3D iotlb->iova + giommu->offset_within_address_space; > MemoryRegion *mr; > hwaddr xlat; > hwaddr len =3D iotlb->addr_mask + 1; > void *vaddr; > int ret; > =20 > - trace_vfio_iommu_map_notify(iotlb->iova, > - iotlb->iova + iotlb->addr_mask); > + trace_vfio_iommu_map_notify(iova, iova + iotlb->addr_mask); > =20 > /* > * The IOMMU TLB entry we have just covers translation through > @@ -291,21 +291,21 @@ static void vfio_iommu_map_notify(Notifier *n, void= *data) > =20 > if ((iotlb->perm & IOMMU_RW) !=3D IOMMU_NONE) { > vaddr =3D memory_region_get_ram_ptr(mr) + xlat; > - ret =3D vfio_dma_map(container, iotlb->iova, > + ret =3D vfio_dma_map(container, iova, > iotlb->addr_mask + 1, vaddr, > !(iotlb->perm & IOMMU_WO) || mr->readonly); > if (ret) { > error_report("vfio_dma_map(%p, 0x%"HWADDR_PRIx", " > "0x%"HWADDR_PRIx", %p) =3D %d (%m)", > - container, iotlb->iova, > + container, iova, > iotlb->addr_mask + 1, vaddr, ret); > } > } else { > - ret =3D vfio_dma_unmap(container, iotlb->iova, iotlb->addr_mask = + 1); > + ret =3D vfio_dma_unmap(container, iova, iotlb->addr_mask + 1); > if (ret) { > error_report("vfio_dma_unmap(%p, 0x%"HWADDR_PRIx", " > "0x%"HWADDR_PRIx") =3D %d (%m)", > - container, iotlb->iova, > + container, iova, > iotlb->addr_mask + 1, ret); > } > } > @@ -377,6 +377,8 @@ static void vfio_listener_region_add(MemoryListener *= listener, > */ > giommu =3D g_malloc0(sizeof(*giommu)); > giommu->iommu =3D section->mr; > + giommu->offset_within_address_space =3D > + section->offset_within_address_space; > giommu->container =3D container; > giommu->n.notify =3D vfio_iommu_map_notify; > QLIST_INSERT_HEAD(&container->giommu_list, giommu, giommu_next); > diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h > index f037f3c..9ffa681 100644 > --- a/include/hw/vfio/vfio-common.h > +++ b/include/hw/vfio/vfio-common.h > @@ -80,6 +80,7 @@ typedef struct VFIOContainer { > typedef struct VFIOGuestIOMMU { > VFIOContainer *container; > MemoryRegion *iommu; > + hwaddr offset_within_address_space; > Notifier n; > QLIST_ENTRY(VFIOGuestIOMMU) giommu_next; > } VFIOGuestIOMMU; --=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 --xo44VMWPx7vlQ2+2 Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJW15S4AAoJEGw4ysog2bOSlKwQALaEUbeCIWo0ZzyGb7UOdjQ2 NP+OfYLPJ44SYxckrQsIwtgUCulH1WL+F7sWla17Mbk+J04nguQ6X6k0ese0HdkR y0ruoWVqiN3zYBp79ipFVZ6jqLnCYKQaXJBmYwjWV6xySRBTF3BXXqi9r420aXxd eweITIamZyiZUQO9q2bSe1Xd9HMMY5NIoGOw8tYhf4xbILgcjcwAdebBeOFdT/Ki +SEevsk1AxtpxoWJcO1MXeE00FHSFTAsFOdzN1r2t0vOweJOrOKQdf+yoOmQxZ0+ Piq7nGxxQ1xO9Uc4w/w/LJ8VJq7Qw73B+wRv8F3IIDJarrTYvDimCYcLLTSSsttE rgoFrZu0x/fISMiXed9qjjjDcJQFykwJqgatBg3Sx7oP1U0oaa9LgoeIUNlAVY1f ciupMHdh/iAyavQTYAyDxg2OQkyceaqjgTijOL9+IqkuS1n37KAUkvd7euZtXhro zptKVzU2ksqJKQwTXZZjyCn32VNIsrzZQ0pVvD+zGNZ0D9IiJX2flaJo7AwffHuO 7h6yRaFMapFFu+yOG71AGPpUqB4RGPNo/DDnqjCyMmZynKDNldo2GwozKlXt0a8H EiUrrzEA/8ASHjO9th7W8/yP8o2bsFUZFCGgYHSwjb1PDPZFesJ0FJoGQMt0UF9m EkRsjkXhfg7tRr6TYfT/ =iogM -----END PGP SIGNATURE----- --xo44VMWPx7vlQ2+2--