On Wed, Jan 29, 2020 at 04:16:33AM -0800, Liu, Yi L wrote: > From: Liu Yi L <yi.l.liu@xxxxxxxxx> > > Currently, many platform vendors provide the capability of dual stage > DMA address translation in hardware. For example, nested translation > on Intel VT-d scalable mode, nested stage translation on ARM SMMUv3, > and etc. In dual stage DMA address translation, there are two stages > address translation, stage-1 (a.k.a first-level) and stage-2 (a.k.a > second-level) translation structures. Stage-1 translation results are > also subjected to stage-2 translation structures. Take vSVA (Virtual > Shared Virtual Addressing) as an example, guest IOMMU driver owns > stage-1 translation structures (covers GVA->GPA translation), and host > IOMMU driver owns stage-2 translation structures (covers GPA->HPA > translation). VMM is responsible to bind stage-1 translation structures > to host, thus hardware could achieve GVA->GPA and then GPA->HPA > translation. For more background on SVA, refer the below links. > - https://www.youtube.com/watch?v=Kq_nfGK5MwQ > - https://events19.lfasiallc.com/wp-content/uploads/2017/11/\ > Shared-Virtual-Memory-in-KVM_Yi-Liu.pdf > > As above, dual stage DMA translation offers two stage address mappings, > which could have better DMA address translation support for passthru > devices. This is also what vIOMMU developers are doing so far. Efforts > includes vSVA enabling from Yi Liu and SMMUv3 Nested Stage Setup from > Eric Auger. > https://www.spinics.net/lists/kvm/msg198556.html > https://lists.gnu.org/archive/html/qemu-devel/2019-07/msg02842.html > > Both efforts are aiming to expose a vIOMMU with dual stage hardware > backed. As so, QEMU needs to have an explicit object to stand for > the dual stage capability from hardware. Such object offers abstract > for the dual stage DMA translation related operations, like: > > 1) PASID allocation (allow host to intercept in PASID allocation) > 2) bind stage-1 translation structures to host > 3) propagate stage-1 cache invalidation to host > 4) DMA address translation fault (I/O page fault) servicing etc. > > This patch introduces DualStageIOMMUObject to stand for the hardware > dual stage DMA translation capability. PASID allocation/free are the > first operation included in it, in future, there will be more operations > like bind_stage1_pgtbl and invalidate_stage1_cache and etc. > > Cc: Kevin Tian <kevin.tian@xxxxxxxxx> > Cc: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx> > Cc: Peter Xu <peterx@xxxxxxxxxx> > Cc: Eric Auger <eric.auger@xxxxxxxxxx> > Cc: Yi Sun <yi.y.sun@xxxxxxxxxxxxxxx> > Cc: David Gibson <david@xxxxxxxxxxxxxxxxxxxxx> > Signed-off-by: Liu Yi L <yi.l.liu@xxxxxxxxx> Several overall queries about this: 1) Since it's explicitly handling PASIDs, this seems a lot more specific to SVM than the name suggests. I'd suggest a rename. 2) Why are you hand rolling structures of pointers, rather than making this a QOM class or interface and putting those things into methods? 3) It's not really clear to me if this is for the case where both stages of translation are visible to the guest, or only one of them. -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
Attachment:
signature.asc
Description: PGP signature