On Tue, Jun 30, 2020 at 10:41:10AM +0800, Jason Wang wrote:
> >      /* According to ATS spec table 2.4:
> >       * S = 0, bits 15:12 = xxxx     range size: 4K
> >       * S = 1, bits 15:12 = xxx0     range size: 8K
> >       * S = 1, bits 15:12 = xx01     range size: 16K
> >       * S = 1, bits 15:12 = x011     range size: 32K
> >       * S = 1, bits 15:12 = 0111     range size: 64K
> >       * ...
> >       */
> 
> 
> Right, but the comment is probably misleading here, since it's for the PCI-E
> transaction between IOMMU and device not for the device IOTLB invalidation
> descriptor.
> 
> For device IOTLB invalidation descriptor, spec allows a [0, ~0ULL]
> invalidation:
> 
> "
> 
> 6.5.2.5 Device-TLB Invalidate Descriptor
> 
> ...
> 
> Size (S): The size field indicates the number of consecutive pages targeted
> by this invalidation
> request. If S field is zero, a single page at page address specified by
> Address [63:12] is requested
> to be invalidated. If S field is Set, the least significant bit in the
> Address field with value 0b
> indicates the invalidation address range. For example, if S field is Set and
> Address[12] is Clear, it
> indicates an 8KB invalidation address range with base address in Address
> [63:13]. If S field and
> Address[12] is Set and bit 13 is Clear, it indicates a 16KB invalidation
> address range with base
> address in Address [63:14], etc.
> 
> "
> 
> So if we receive an address whose [63] is 0 and the rest is all 1, it's then
> a [0, ~0ULL] invalidation.

Yes.  I think invalidating the whole range is always fine.  It's still not
arbitrary, right?  E.g., we can't even invalidate (0x1000, 0x3000) with
device-iotlb because of the address mask, not to say sub-pages.

> 
> 
> > 
> > > 
> > > > > How about just convert to use a range [start, end] for any notifier 
> > > > > and move
> > > > > the checks (e.g the assert) into the actual notifier implemented 
> > > > > (vhost or
> > > > > vfio)?
> > > > IOMMUTLBEntry itself is the abstraction layer of TLB entry.  Hardware 
> > > > TLB entry
> > > > is definitely not arbitrary range either (because AFAICT the hardware 
> > > > should
> > > > only cache PFN rather than address, so at least PAGE_SIZE aligned).
> > > > Introducing this flag will already make this trickier just to avoid 
> > > > introducing
> > > > another similar struct to IOMMUTLBEntry, but I really don't want to 
> > > > make it a
> > > > default option...  Not to mention I probably have no reason to urge the 
> > > > rest
> > > > iommu notifier users (tcg, vfio) to change their existing good code to 
> > > > suite
> > > > any of the backend who can cooperate with arbitrary address ranges...
> > > 
> > > Ok, so it looks like we need a dedicated notifiers to device IOTLB.
> > Or we can also make a new flag for device iotlb just like current UNMAP? 
> > Then
> > we replace the vhost type from UNMAP to DEVICE_IOTLB.  But IMHO using the
> > ARBITRARY_LENGTH flag would work in a similar way.  DEVICE_IOTLB flag could
> > also allow virtio/vhost to only receive one invalidation (now IIUC it'll
> > receive both iotlb and device-iotlb for unmapping a page when ats=on), but 
> > then
> > ats=on will be a must and it could break some old (misconfiged) qemu because
> > afaict previously virtio/vhost could even work with vIOMMU (accidentally) 
> > even
> > without ats=on.
> 
> 
> That's a bug and I don't think we need to workaround mis-configurated qemu
> :)

IMHO it depends on the strictness we want on the qemu cmdline API. :)

We should at least check libvirt to make sure it's using ats=on always, then I
agree maybe we can avoid considering the rest...

Thanks,

-- 
Peter Xu


Reply via email to