|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v2 2/2] VT-d: avoid infinite recursion on domain_context_mapping_one() error path
> From: Jan Beulich <jbeulich@xxxxxxxx>
> Sent: Thursday, April 7, 2022 2:12 PM
>
> Despite the comment there infinite recursion was still possible, by
> flip-flopping between two domains. This is because prev_dom is derived
> from the DID found in the context entry, which was already updated by
> the time error recovery is invoked. Simply introduce yet another mode
> flag to prevent rolling back an in-progress roll-back of a prior
> mapping attempt.
>
> Also drop the existing recursion prevention for having been dead anyway:
> Earlier in the function we already bail when prev_dom == domain.
>
> Fixes: 8f41e481b485 ("VT-d: re-assign devices directly")
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx>
> ---
> v2: Extend scope of the approach taken. Leverage for some cleanup.
>
> --- a/xen/drivers/passthrough/vtd/iommu.c
> +++ b/xen/drivers/passthrough/vtd/iommu.c
> @@ -1599,7 +1599,7 @@ int domain_context_mapping_one(
> if ( !seg && !rc )
> rc = me_wifi_quirk(domain, bus, devfn, domid, pgd_maddr, mode);
>
> - if ( rc )
> + if ( rc && !(mode & MAP_ERROR_RECOVERY) )
> {
> if ( !prev_dom ||
> /*
> @@ -1609,13 +1609,12 @@ int domain_context_mapping_one(
> */
> (prev_dom == dom_io && !pdev) )
> ret = domain_context_unmap_one(domain, iommu, bus, devfn);
> - else if ( prev_dom != domain ) /* Avoid infinite recursion. */
> + else
> ret = domain_context_mapping_one(prev_dom, iommu, bus, devfn,
> pdev,
> DEVICE_DOMID(prev_dom, pdev),
> DEVICE_PGTABLE(prev_dom, pdev),
> - mode & MAP_WITH_RMRR) < 0;
> - else
> - ret = 1;
> + (mode & MAP_WITH_RMRR) |
> + MAP_ERROR_RECOVERY) < 0;
>
> if ( !ret && pdev && pdev->devfn == devfn )
> check_cleanup_domid_map(domain, pdev, iommu);
> --- a/xen/drivers/passthrough/vtd/vtd.h
> +++ b/xen/drivers/passthrough/vtd/vtd.h
> @@ -29,7 +29,8 @@
> #define MAP_WITH_RMRR (1u << 0)
> #define MAP_OWNER_DYING (1u << 1)
> #define MAP_SINGLE_DEVICE (1u << 2)
> -#define UNMAP_ME_PHANTOM_FUNC (1u << 3)
> +#define MAP_ERROR_RECOVERY (1u << 3)
> +#define UNMAP_ME_PHANTOM_FUNC (1u << 4)
>
> /* Allow for both IOAPIC and IOSAPIC. */
> #define IO_xAPIC_route_entry IO_APIC_route_entry
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |