|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH for-4.15 1/4] xen/iommu: Check if the IOMMU was initialized before tearing down
> -----Original Message-----
> From: Julien Grall <julien@xxxxxxx>
> Sent: 22 December 2020 15:44
> To: xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: hongyxia@xxxxxxxxxxxx; Julien Grall <jgrall@xxxxxxxxxx>; Jan Beulich
> <jbeulich@xxxxxxxx>; Paul
> Durrant <paul@xxxxxxx>
> Subject: [PATCH for-4.15 1/4] xen/iommu: Check if the IOMMU was initialized
> before tearing down
>
> From: Julien Grall <jgrall@xxxxxxxxxx>
>
> is_iommu_enabled() will return true even if the IOMMU has not been
> initialized (e.g. the ops are not set).
>
> In the case of an early failure in arch_domain_init(), the function
> iommu_destroy_domain() will be called even if the IOMMU is initialized.
>
> This will result to dereference the ops which will be NULL and an host
> crash.
>
> Fix the issue by checking that ops has been set before accessing it.
> Note that we are assuming that arch_iommu_domain_init() will cleanup an
> intermediate failure if it failed.
>
> Fixes: 71e617a6b8f6 ("use is_iommu_enabled() where appropriate...")
> Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx>
> ---
> xen/drivers/passthrough/iommu.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
> index 2358b6eb09f4..f976d5a0b0a5 100644
> --- a/xen/drivers/passthrough/iommu.c
> +++ b/xen/drivers/passthrough/iommu.c
> @@ -226,7 +226,15 @@ static void iommu_teardown(struct domain *d)
>
> void iommu_domain_destroy(struct domain *d)
> {
> - if ( !is_iommu_enabled(d) )
> + struct domain_iommu *hd = dom_iommu(d);
> +
> + /*
> + * In case of failure during the domain construction, it would be
> + * possible to reach this function with the IOMMU enabled but not
> + * yet initialized. We assume that hd->platforms will be non-NULL as
> + * soon as we start to initialize the IOMMU.
> + */
> + if ( !is_iommu_enabled(d) || !hd->platform_ops )
> return;
TBH, this seems like the wrong way to fix it. The ops dereference is done in
iommu_teardown() so that ought to be doing the check,
but given it is single line function then it could be inlined at the same time.
That said, I think arch_iommu_domain_destroy() needs
to be call unconditionally as it arch_iommu_domain_init() is called before the
ops pointer is set.
Paul
>
> iommu_teardown(d);
> --
> 2.17.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |