diff -urp a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c --- a/drivers/iommu/intel-iommu.c 2014-12-29 10:52:02.000000000 +0800 +++ b/drivers/iommu/intel-iommu.c 2014-12-29 09:36:23.000000000 +0800 @@ -5188,6 +5188,8 @@ static void __iommu_load_old_root_entry( || (!iommu->root_entry_old_phys)) return; memcpy(iommu->root_entry, iommu->root_entry_old_virt, PAGE_SIZE); + + __iommu_flush_cache(iommu, iommu->root_entry, PAGE_SIZE); } /* @@ -5220,6 +5222,8 @@ static void __iommu_update_old_root_entr to = iommu->root_entry_old_virt; from = iommu->root_entry; memcpy(to + start, from + start, size); + + __iommu_flush_cache(iommu, to + start, size); } /* diff -urp a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c --- a/drivers/iommu/intel_irq_remapping.c 2014-12-29 10:52:02.000000000 +0800 +++ b/drivers/iommu/intel_irq_remapping.c 2014-12-29 09:51:52.000000000 +0800 @@ -1350,6 +1350,9 @@ static int __iommu_load_old_irte(struct iommu->ir_table->base_old_virt, INTR_REMAP_TABLE_ENTRIES*sizeof(struct irte)); + __iommu_flush_cache(iommu, iommu->ir_table->base, + INTR_REMAP_TABLE_ENTRIES*sizeof(struct irte)); + return 0; } @@ -1382,6 +1385,8 @@ static int __iommu_update_old_irte(struc from = iommu->ir_table->base; memcpy(to + start, from + start, size); + __iommu_flush_cache(iommu, to + start, size); + return 0; } #endif /* CONFIG_CRASH_DUMP */