| From f60082fe199bd77ef50a4aa1f99ddd9b88c9112e Mon Sep 17 00:00:00 2001 |
| From: Lu Baolu <baolu.lu@linux.intel.com> |
| Date: Thu, 16 Jan 2020 09:52:36 +0800 |
| Subject: [PATCH] iommu/vt-d: Remove unnecessary WARN_ON_ONCE() |
| |
| commit 857f081426e5aa38313426c13373730f1345fe95 upstream. |
| |
| Address field in device TLB invalidation descriptor is qualified |
| by the S field. If S field is zero, a single page at page address |
| specified by address [63:12] is requested to be invalidated. If S |
| field is set, the least significant bit in the address field with |
| value 0b (say bit N) indicates the invalidation address range. The |
| spec doesn't require the address [N - 1, 0] to be cleared, hence |
| remove the unnecessary WARN_ON_ONCE(). |
| |
| Otherwise, the caller might set "mask = MAX_AGAW_PFN_WIDTH" in order |
| to invalidating all the cached mappings on an endpoint, and below |
| overflow error will be triggered. |
| |
| [...] |
| UBSAN: Undefined behaviour in drivers/iommu/dmar.c:1354:3 |
| shift exponent 64 is too large for 64-bit type 'long long unsigned int' |
| [...] |
| |
| Reported-and-tested-by: Frank <fgndev@posteo.de> |
| Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> |
| Signed-off-by: Joerg Roedel <jroedel@suse.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c |
| index 5d0754ed5fa0..dc4824f997e8 100644 |
| --- a/drivers/iommu/dmar.c |
| +++ b/drivers/iommu/dmar.c |
| @@ -1351,7 +1351,6 @@ void qi_flush_dev_iotlb(struct intel_iommu *iommu, u16 sid, u16 pfsid, |
| struct qi_desc desc; |
| |
| if (mask) { |
| - WARN_ON_ONCE(addr & ((1ULL << (VTD_PAGE_SHIFT + mask)) - 1)); |
| addr |= (1ULL << (VTD_PAGE_SHIFT + mask - 1)) - 1; |
| desc.qw1 = QI_DEV_IOTLB_ADDR(addr) | QI_DEV_IOTLB_SIZE; |
| } else |
| -- |
| 2.7.4 |
| |