From: Jan Beulich Date: Mon, 12 Oct 2015 13:58:35 +0000 (+0200) Subject: VT-d: don't suppress invalidation address write when it is zero X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~2401 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=710942e57fb42ff8f344ca82f6b678f67e38ae63;p=xen.git VT-d: don't suppress invalidation address write when it is zero GFN zero is a valid address, and hence may need invalidation done for it just like for any other GFN. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper Acked-by: Yang Zhang --- diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 82549376cf..d95f4d4720 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -414,7 +414,7 @@ static int flush_iotlb_reg(void *_iommu, u16 did, { struct iommu *iommu = (struct iommu *) _iommu; int tlb_offset = ecap_iotlb_offset(iommu->ecap); - u64 val = 0, val_iva = 0; + u64 val = 0; unsigned long flags; /* @@ -435,7 +435,6 @@ static int flush_iotlb_reg(void *_iommu, u16 did, switch ( type ) { case DMA_TLB_GLOBAL_FLUSH: - /* global flush doesn't need set IVA_REG */ val = DMA_TLB_GLOBAL_FLUSH|DMA_TLB_IVT; break; case DMA_TLB_DSI_FLUSH: @@ -443,8 +442,6 @@ static int flush_iotlb_reg(void *_iommu, u16 did, break; case DMA_TLB_PSI_FLUSH: val = DMA_TLB_PSI_FLUSH|DMA_TLB_IVT|DMA_TLB_DID(did); - /* Note: always flush non-leaf currently */ - val_iva = size_order | addr; break; default: BUG(); @@ -457,8 +454,11 @@ static int flush_iotlb_reg(void *_iommu, u16 did, spin_lock_irqsave(&iommu->register_lock, flags); /* Note: Only uses first TLB reg currently */ - if ( val_iva ) - dmar_writeq(iommu->reg, tlb_offset, val_iva); + if ( type == DMA_TLB_PSI_FLUSH ) + { + /* Note: always flush non-leaf currently. */ + dmar_writeq(iommu->reg, tlb_offset, size_order | addr); + } dmar_writeq(iommu->reg, tlb_offset + 8, val); /* Make sure hardware complete it */