OSDN Git Service

iommu/vt-d: Correctly check addr alignment in qi_flush_dev_iotlb_pasid()
authorLu Baolu <baolu.lu@linux.intel.com>
Tue, 19 Jan 2021 04:35:00 +0000 (12:35 +0800)
committerJoerg Roedel <jroedel@suse.de>
Thu, 28 Jan 2021 12:17:08 +0000 (13:17 +0100)
An incorrect address mask is being used in the qi_flush_dev_iotlb_pasid()
to check the address alignment. This leads to a lot of spurious kernel
warnings:

[  485.837093] DMAR: Invalidate non-aligned address 7f76f47f9000, order 0
[  485.837098] DMAR: Invalidate non-aligned address 7f76f47f9000, order 0
[  492.494145] qi_flush_dev_iotlb_pasid: 5734 callbacks suppressed
[  492.494147] DMAR: Invalidate non-aligned address 7f7728800000, order 11
[  492.508965] DMAR: Invalidate non-aligned address 7f7728800000, order 11

Fix it by checking the alignment in right way.

Fixes: 288d08e780088 ("iommu/vt-d: Handle non-page aligned address")
Reported-and-tested-by: Guo Kaijie <Kaijie.Guo@intel.com>
Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Cc: Liu Yi L <yi.l.liu@intel.com>
Link: https://lore.kernel.org/r/20210119043500.1539596-1-baolu.lu@linux.intel.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/intel/dmar.c

index 004feae..02e7c10 100644 (file)
@@ -1496,7 +1496,7 @@ void qi_flush_dev_iotlb_pasid(struct intel_iommu *iommu, u16 sid, u16 pfsid,
         * Max Invs Pending (MIP) is set to 0 for now until we have DIT in
         * ECAP.
         */
-       if (addr & GENMASK_ULL(size_order + VTD_PAGE_SHIFT, 0))
+       if (!IS_ALIGNED(addr, VTD_PAGE_SIZE << size_order))
                pr_warn_ratelimited("Invalidate non-aligned address %llx, order %d\n",
                                    addr, size_order);