Commit 61363c1474b1 ("iommu/vt-d: Enable ATS only if the device uses
page aligned address.") disables ATS for device that can do unaligned
page request.

This looks wrong, since the commit log said it's because the page
request descriptor doesn't support reporting unaligned request.

A victim is Qemu's virtio-pci which doesn't advertise the page aligned
address. Fixing by disable PRI instead of ATS if device doesn't have
page aligned request.

Cc: [email protected]
Cc: Ashok Raj <[email protected]>
Cc: Jacob Pan <[email protected]>
Cc: Keith Busch <[email protected]>
Cc: Kuppuswamy Sathyanarayanan <[email protected]>
Signed-off-by: Jason Wang <[email protected]>
---
 drivers/iommu/intel/iommu.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index e9864e52b0e9..ef5214a8a4dd 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -1440,10 +1440,11 @@ static void iommu_enable_dev_iotlb(struct 
device_domain_info *info)
 
        if (info->pri_supported &&
            (info->pasid_enabled ? pci_prg_resp_pasid_required(pdev) : 1)  &&
+           pci_ats_page_aligned(pdev) &&
            !pci_reset_pri(pdev) && !pci_enable_pri(pdev, 32))
                info->pri_enabled = 1;
 #endif
-       if (info->ats_supported && pci_ats_page_aligned(pdev) &&
+       if (info->ats_supported &&
            !pci_enable_ats(pdev, VTD_PAGE_SHIFT)) {
                info->ats_enabled = 1;
                domain_update_iotlb(info->domain);
-- 
2.20.1

Reply via email to