[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/iommu: arm: Don't insert an IOMMU mapping when the grantee and granter...
Hello Julien, > On 14 Feb 2021, at 2:35 pm, Julien Grall <julien@xxxxxxx> wrote: > > From: Julien Grall <jgrall@xxxxxxxxxx> > > ... are the same. > > When the IOMMU is enabled and the domain is direct mapped (e.g. Dom0), > Xen will insert a 1:1 mapping for each grant mapping in the P2M to > allow DMA. > > This works quite well when the grantee and granter and /s/and/are > not the same > because the GFN in the P2M should not be mapped. However, if they are > the same, we will overwrite the mapping. Worse, it will be completely > removed when the grant is unmapped. > > As the domain is direct mapped, a 1:1 mapping should always present in > the P2M. This is not 100% guaranteed if the domain decides to mess with > the P2M. However, such domain would already end up in trouble as the > page would be soon be freed (when the last reference dropped). > > Add an additional check in arm_iommu_{,un}map_page() to check whether > the page belongs to the domain. If it is belongs to it, then ignore the > request. > > Note that we don't need to hold an extra reference on the page because > the grant code will already do it for us. > > Reported-by: Rahul Singh <Rahul.Singh@xxxxxxx> > Fixes: 552710b38863 ("xen/arm: grant: Add another entry to map MFN 1:1 in > dom0 p2m") > Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx> With the typo fixed. Reviewed-by: Rahul Singh <rahul.singh@xxxxxxx> Tested-by: Rahul Singh <rahul.singh@xxxxxxx> Regards, Rahul > > --- > > This is a candidate for 4.15. Without the patch, it would not be > possible to get the frontend and backend in the same domain (useful when > trying to map the guest block device in dom0). > --- > xen/drivers/passthrough/arm/iommu_helpers.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/xen/drivers/passthrough/arm/iommu_helpers.c > b/xen/drivers/passthrough/arm/iommu_helpers.c > index a36e2b8e6c42..35a813308b8c 100644 > --- a/xen/drivers/passthrough/arm/iommu_helpers.c > +++ b/xen/drivers/passthrough/arm/iommu_helpers.c > @@ -53,6 +53,17 @@ int __must_check arm_iommu_map_page(struct domain *d, > dfn_t dfn, mfn_t mfn, > > t = (flags & IOMMUF_writable) ? p2m_iommu_map_rw : p2m_iommu_map_ro; > > + /* > + * The granter and grantee can be the same domain. In normal > + * condition, the 1:1 mapping should already present in the P2M so > + * we want to avoid overwriting it. > + * > + * Note that there is no guarantee the 1:1 mapping will be present > + * if the domain decides to mess with the P2M. > + */ > + if ( page_get_owner(mfn_to_page(mfn)) == d ) > + return 0; > + > /* > * The function guest_physmap_add_entry replaces the current mapping > * if there is already one... > @@ -71,6 +82,13 @@ int __must_check arm_iommu_unmap_page(struct domain *d, > dfn_t dfn, > if ( !is_domain_direct_mapped(d) ) > return -EINVAL; > > + /* > + * When the granter and grantee are the same, we didn't insert a > + * mapping. So ignore the unmap request. > + */ > + if ( page_get_owner(mfn_to_page(_mfn(dfn_x(dfn)))) == d ) > + return 0; > + > return guest_physmap_remove_page(d, _gfn(dfn_x(dfn)), _mfn(dfn_x(dfn)), > 0); > } > > -- > 2.17.1 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |