static int iommu_flush_pages(struct amd_iommu *iommu, u16 domid,
                u64 address, size_t size)
 {
-       int i;
+       int s = 0;
        unsigned pages = to_pages(address, size);
 
        address &= PAGE_MASK;
 
-       for (i = 0; i < pages; ++i) {
-               iommu_queue_inv_iommu_pages(iommu, address, domid, 0, 0);
-               address += PAGE_SIZE;
+       if (pages > 1) {
+               /*
+                * If we have to flush more than one page, flush all
+                * TLB entries for this domain
+                */
+               address = CMD_INV_IOMMU_ALL_PAGES_ADDRESS;
+               s = 1;
        }
 
+       iommu_queue_inv_iommu_pages(iommu, address, domid, 0, s);
+
        return 0;
 }
 
 
 #define CMD_INV_IOMMU_PAGES_SIZE_MASK  0x01
 #define CMD_INV_IOMMU_PAGES_PDE_MASK   0x02
 
+#define CMD_INV_IOMMU_ALL_PAGES_ADDRESS        0x7fffffffffffffffULL
+
 /* macros and definitions for device table entries */
 #define DEV_ENTRY_VALID         0x00
 #define DEV_ENTRY_TRANSLATION   0x01