From b111a41acd383c42c35707dbb1849d366ca43cce Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Wed, 24 Nov 2021 11:05:36 +0100 Subject: [PATCH] VT-d: properly reserve DID 0 for caching mode IOMMUs MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Merely setting bit 0 in the bitmap is insufficient, as then Dom0 will still have DID 0 allocated to it, because of the zero-filling of domid_map[]. Set slot 0 to DOMID_INVALID to keep DID 0 from getting used. Fixes: b9c20c78789f ("VT-d: per-iommu domain-id") Signed-off-by: Jan Beulich Reviewed-by: Roger Pau Monné Reviewed-by: Kevin Tian --- xen/drivers/passthrough/vtd/iommu.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 5de9a73f56..643db07cf0 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1259,16 +1259,19 @@ int __init iommu_alloc(struct acpi_drhd_unit *drhd) if ( !iommu->domid_bitmap ) return -ENOMEM; + iommu->domid_map = xzalloc_array(u16, nr_dom); + if ( !iommu->domid_map ) + return -ENOMEM; + /* - * if Caching mode is set, then invalid translations are tagged with - * domain id 0, Hence reserve bit 0 for it + * If Caching mode is set, then invalid translations are tagged with + * domain id 0. Hence reserve bit/slot 0. */ if ( cap_caching_mode(iommu->cap) ) + { + iommu->domid_map[0] = DOMID_INVALID; __set_bit(0, iommu->domid_bitmap); - - iommu->domid_map = xzalloc_array(u16, nr_dom); - if ( !iommu->domid_map ) - return -ENOMEM; + } return 0; } -- 2.30.2