|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH 2/4] VT-d: consider hidden devices when unmapping
> From: Jan Beulich
> Sent: Wednesday, September 15, 2021 5:13 PM
>
> Whether to clear an IOMMU's bit in the domain's bitmap should depend on
> all devices the domain can control. For the hardware domain this
> includes hidden devices, which are associated with DomXEN.
>
> While touching related logic, convert "found" to "bool".
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> --- a/xen/drivers/passthrough/vtd/iommu.c
> +++ b/xen/drivers/passthrough/vtd/iommu.c
> @@ -1657,7 +1657,7 @@ static int domain_context_unmap(struct d
> struct vtd_iommu *iommu = drhd ? drhd->iommu : NULL;
> int ret;
> u8 seg = pdev->seg, bus = pdev->bus, tmp_bus, tmp_devfn, secbus;
> - int found = 0;
> + bool found;
>
> switch ( pdev->type )
> {
> @@ -1737,23 +1737,33 @@ static int domain_context_unmap(struct d
> return ret;
>
> /*
> - * if no other devices under the same iommu owned by this domain,
> - * clear iommu in iommu_bitmap and clear domain_id in domid_bitmp
> + * If no other devices under the same iommu owned by this domain,
> + * clear iommu in iommu_bitmap and clear domain_id in domid_bitmap.
what is changed above?
> */
> - for_each_pdev ( domain, pdev )
> + for ( found = false; ; domain = dom_xen )
honesty speaking I had to read several times to understand the break
condition of this loop. It'd be easier to understand if putting for_each_
pdev(){} into a function and then:
found = func(domain);
if (!found && is_hardware_domain(domain))
found = func(dom_xen);
> {
> - if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn == devfn )
> - continue;
> -
> - drhd = acpi_find_matched_drhd_unit(pdev);
> - if ( drhd && drhd->iommu == iommu )
> + for_each_pdev ( domain, pdev )
> {
> - found = 1;
> - break;
> + if ( pdev->seg == seg && pdev->bus == bus && pdev->devfn ==
> devfn )
> + continue;
> +
> + drhd = acpi_find_matched_drhd_unit(pdev);
> + if ( drhd && drhd->iommu == iommu )
> + {
> + found = true;
> + break;
> + }
> }
> +
> + /*
> + * Hidden devices are associated with DomXEN but usable by the
> + * hardware domain. Hence they need considering here as well.
> + */
> + if ( found || !is_hardware_domain(domain) )
> + break;
> }
>
> - if ( found == 0 )
> + if ( !found )
> {
> clear_bit(iommu->index, &dom_iommu(domain)-
> >arch.vtd.iommu_bitmap);
> cleanup_domid_map(domain, iommu);
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |