[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] VT-d: don't suppress invalidation address write when it is zero


  • To: Jan Beulich <JBeulich@xxxxxxxx>, xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: "Zhang, Yang Z" <yang.z.zhang@xxxxxxxxx>
  • Date: Sat, 10 Oct 2015 05:35:51 +0000
  • Accept-language: en-US
  • Cc: "Tian, Kevin" <kevin.tian@xxxxxxxxx>
  • Delivery-date: Sat, 10 Oct 2015 05:36:21 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>
  • Thread-index: AQHQ+fqN1T9i1OuBtkW6Gx/pH5jOHp5kRmaA
  • Thread-topic: [PATCH] VT-d: don't suppress invalidation address write when it is zero

Jan Beulich wrote on 2015-09-28:
> 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 <jbeulich@xxxxxxxx>

Acked-by: Yang Zhang <yang.z.zhang@xxxxxxxxx>

> ---
> The comment right before the respective dmar_writeq() confuses me:
> What "first" TLB reg does it talk about? Is it simply stale (albeit it 
> has been there already in 3.2.x, i.e. it would then likely have been 
> stale already at the time that code got added)?

I have no idea about the 'first TLB' and didn't find any clue from spec.

> 
> --- 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,  {
>      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,
>      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,
>          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,
> 
>      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 */
>


Best regards,
Yang



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.