}
        address += offset;
 
+       if (unlikely(iommu_has_npcache(iommu)))
+               iommu_flush_pages(iommu, dma_dom->domain.id, address, size);
+
 out:
        return address;
 }
        }
 
        dma_ops_free_addresses(dma_dom, dma_addr, pages);
+
+       iommu_flush_pages(iommu, dma_dom->domain.id, dma_addr, size);
 }
 
 /*
        if (addr == bad_dma_address)
                goto out;
 
-       if (iommu_has_npcache(iommu))
-               iommu_flush_pages(iommu, domain->id, addr, size);
-
        if (iommu->need_sync)
                iommu_completion_wait(iommu);
 
 
        __unmap_single(iommu, domain->priv, dma_addr, size, dir);
 
-       iommu_flush_pages(iommu, domain->id, dma_addr, size);
-
        if (iommu->need_sync)
                iommu_completion_wait(iommu);
 
                        mapped_elems++;
                } else
                        goto unmap;
-               if (iommu_has_npcache(iommu))
-                       iommu_flush_pages(iommu, domain->id, s->dma_address,
-                                         s->dma_length);
        }
 
        if (iommu->need_sync)
        for_each_sg(sglist, s, nelems, i) {
                __unmap_single(iommu, domain->priv, s->dma_address,
                               s->dma_length, dir);
-               iommu_flush_pages(iommu, domain->id, s->dma_address,
-                                 s->dma_length);
                s->dma_address = s->dma_length = 0;
        }
 
                goto out;
        }
 
-       if (iommu_has_npcache(iommu))
-               iommu_flush_pages(iommu, domain->id, *dma_addr, size);
-
        if (iommu->need_sync)
                iommu_completion_wait(iommu);
 
        spin_lock_irqsave(&domain->lock, flags);
 
        __unmap_single(iommu, domain->priv, dma_addr, size, DMA_BIDIRECTIONAL);
-       iommu_flush_pages(iommu, domain->id, dma_addr, size);
 
        if (iommu->need_sync)
                iommu_completion_wait(iommu);