[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH 5/6] VT-d: introduce helper to convert DID to domid_t
> From: Jan Beulich <jbeulich@xxxxxxxx> > Sent: Friday, November 12, 2021 5:50 PM > > This is in preparation of adding another "translation" method. Take the > combination of the extra validation both previously open-coded have been > doing: Bounds check and bitmap check. But don't propagate the previous > pointless check of whether ->domid_map[] was actually allocated, as > failure there would lead to overall failure of IOMMU initialization > anyway. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx> > > --- a/xen/drivers/passthrough/vtd/extern.h > +++ b/xen/drivers/passthrough/vtd/extern.h > @@ -45,6 +45,8 @@ void disable_intremap(struct vtd_iommu * > int iommu_alloc(struct acpi_drhd_unit *drhd); > void iommu_free(struct acpi_drhd_unit *drhd); > > +domid_t did_to_domain_id(const struct vtd_iommu *iommu, unsigned int > did); > + > int iommu_flush_iec_global(struct vtd_iommu *iommu); > int iommu_flush_iec_index(struct vtd_iommu *iommu, u8 im, u16 iidx); > void clear_fault_bits(struct vtd_iommu *iommu); > --- a/xen/drivers/passthrough/vtd/iommu.c > +++ b/xen/drivers/passthrough/vtd/iommu.c > @@ -123,15 +123,16 @@ static int context_get_domain_id(const s > > if ( iommu && context ) > { > - unsigned int nr_dom = cap_ndoms(iommu->cap); > unsigned int dom_index = context_domain_id(*context); > > - if ( dom_index < nr_dom && iommu->domid_map ) > - domid = iommu->domid_map[dom_index]; > - else > + domid = did_to_domain_id(iommu, dom_index); > + if ( domid == DOMID_INVALID ) > + { > dprintk(XENLOG_DEBUG VTDPREFIX, > - "dom_index %u exceeds nr_dom %u or iommu has no > domid_map\n", > - dom_index, nr_dom); > + "no domid for did %u (nr_dom %u)\n", > + dom_index, cap_ndoms(iommu->cap)); > + domid = -1; > + } > } > > return domid; > @@ -193,6 +194,14 @@ static void check_cleanup_domid_map(stru > } > } > > +domid_t did_to_domain_id(const struct vtd_iommu *iommu, unsigned int > did) > +{ > + if ( did >= cap_ndoms(iommu->cap) || !test_bit(did, iommu- > >domid_bitmap) ) > + return DOMID_INVALID; > + > + return iommu->domid_map[did]; > +} > + > static void sync_cache(const void *addr, unsigned int size) > { > static unsigned long clflush_size = 0; > --- a/xen/drivers/passthrough/vtd/qinval.c > +++ b/xen/drivers/passthrough/vtd/qinval.c > @@ -229,10 +229,7 @@ static int __must_check dev_invalidate_s > rc = queue_invalidate_wait(iommu, 0, 1, 1, 1); > if ( rc == -ETIMEDOUT ) > { > - struct domain *d = NULL; > - > - if ( test_bit(did, iommu->domid_bitmap) ) > - d = rcu_lock_domain_by_id(iommu->domid_map[did]); > + struct domain *d = rcu_lock_domain_by_id(did_to_domain_id(iommu, > did)); > > /* > * In case the domain has been freed or the IOMMU domid bitmap is
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |