Messages in this thread Patch in this message | | | Date | Tue, 27 Jun 2023 16:01:01 +0800 | Subject | Re: [PATCH 1/2] iommu: Prevent RESV_DIRECT devices from blocking domains | From | Baolu Lu <> |
| |
On 2023/6/27 15:54, Tian, Kevin wrote: >> From: Baolu Lu <baolu.lu@linux.intel.com> >> Sent: Tuesday, June 13, 2023 11:15 AM >> >> On 6/12/23 4:28 PM, Liu, Jingqi wrote: >>> On 6/7/2023 11:51 AM, Lu Baolu wrote: >>>> - >>>> - BUG_ON(!domain->pgsize_bitmap); >>>> - >>>> - pg_size = 1UL << __ffs(domain->pgsize_bitmap); >>>> + pg_size = domain->pgsize_bitmap ? 1UL << >>>> __ffs(domain->pgsize_bitmap) : 0; >>> Would it be better to add the following check here? >>> if (WARN_ON(!pg_size)) >>> return -EINVAL; >>> >>> Instead of checking latter in the loop as follows. >>> if (WARN_ON_ONCE(!pg_size)) { >>> ret = -EINVAL; >>> goto out; >>> } >> >> I am afraid no. Only the paging domains need a valid pg_size. That's the >> reason why I put it after the iommu_is_dma_domain() check. The previous >> code has the same behavior too. >> > > You could also add the dma domain check here. pg_size is static > then it makes more sense to verify it once instead of in a loop.
Agreed. Does below additional change make sense?
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index e59de7852067..3be88b5f36bb 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -962,6 +962,9 @@ static int iommu_create_device_direct_mappings(struct iommu_domain *domain, pg_size = domain->pgsize_bitmap ? 1UL << __ffs(domain->pgsize_bitmap) : 0; INIT_LIST_HEAD(&mappings);
+ if (WARN_ON_ONCE((domain->type & __IOMMU_DOMAIN_PAGING) && !pg_size)) + return -EINVAL; + iommu_get_resv_regions(dev, &mappings);
/* We need to consider overlapping regions for different devices */ @@ -977,11 +980,6 @@ static int iommu_create_device_direct_mappings(struct iommu_domain *domain, !iommu_is_dma_domain(domain)) continue;
- if (WARN_ON_ONCE(!pg_size)) { - ret = -EINVAL; - goto out; - } - start = ALIGN(entry->start, pg_size); end = ALIGN(entry->start + entry->length, pg_size);
Best regards, baolu
| |