iommu/vt-d: Allow to flush more than 4GB of device TLBs
authorJoerg Roedel <jroedel@suse.de>
Fri, 11 Aug 2017 09:42:46 +0000 (11:42 +0200)
committerJoerg Roedel <jroedel@suse.de>
Tue, 15 Aug 2017 16:23:53 +0000 (18:23 +0200)
The shift qi_flush_dev_iotlb() is done on an int, which
limits the mask to 32 bits. Make the mask 64 bits wide so
that more than 4GB of address range can be flushed at once.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/dmar.c

index c8b0329c85d2801e1cd99c74c9959f03ee1790d2..ca5ebaeafd6acee8d11033b34ba912eeebc04689 100644 (file)
@@ -1343,7 +1343,7 @@ void qi_flush_dev_iotlb(struct intel_iommu *iommu, u16 sid, u16 qdep,
 
        if (mask) {
                BUG_ON(addr & ((1 << (VTD_PAGE_SHIFT + mask)) - 1));
-               addr |= (1 << (VTD_PAGE_SHIFT + mask - 1)) - 1;
+               addr |= (1ULL << (VTD_PAGE_SHIFT + mask - 1)) - 1;
                desc.high = QI_DEV_IOTLB_ADDR(addr) | QI_DEV_IOTLB_SIZE;
        } else
                desc.high = QI_DEV_IOTLB_ADDR(addr);