Hi David, > From: David Gibson [mailto:david@xxxxxxxxxxxxxxxxxxxxx] > Sent: Friday, January 31, 2020 12:07 PM > To: Liu, Yi L <yi.l.liu@xxxxxxxxx> > Subject: Re: [RFC v3 03/25] hw/iommu: introduce IOMMUContext > > On Wed, Jan 29, 2020 at 04:16:34AM -0800, Liu, Yi L wrote: > > From: Peter Xu <peterx@xxxxxxxxxx> > > > > 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. Also there are efforts to make QEMU vIOMMU be backed by dual > > stage DMA address translation capability provided by hardware to have > > better address translation support for passthru devices. > > > > As so, making vIOMMU be backed by dual stage translation capability > > requires QEMU vIOMMU to have a way to get aware of such hardware > > capability and also require a way to receive DMA address translation > > faults (e.g. I/O page request) from host as guest owns stage-1 translation > > structures in dual stage DAM address translation. > > > > This patch adds IOMMUContext as an abstract of vIOMMU related operations. > > Like provide a way for passthru modules (e.g. VFIO) to register > > DualStageIOMMUObject instances. And in future, it is expected to offer > > support for receiving host DMA translation faults happened on stage-1 > > translation. > > > > For more backgrounds, may refer to the discussion below, while there > > is also difference between the current implementation and original > > proposal. This patch introduces the IOMMUContext as an abstract layer > > for passthru module (e.g. VFIO) calls into vIOMMU. The first introduced > > interface is to make QEMU vIOMMU be aware of dual stage translation > > capability. > > > > https://lists.gnu.org/archive/html/qemu-devel/2019-07/msg05022.html > > Again, is there a reason for not making this a QOM class or interface? I guess it is enough to make a simple abstract layer as explained in prior email. IOMMUContext is to provide explicit method for VFIO to call into vIOMMU emulators. > > I'm not very clear on the relationship betwen an IOMMUContext and a > DualStageIOMMUObject. Can there be many IOMMUContexts to a > DualStageIOMMUOBject? The other way around? Or is it just > zero-or-one DualStageIOMMUObjects to an IOMMUContext? It is possible. As the below patch shows, DualStageIOMMUObject is per vfio container. IOMMUContext can be either per-device or shared across devices, it depends on vendor specific vIOMMU emulators. [RFC v3 10/25] vfio: register DualStageIOMMUObject to vIOMMU https://www.spinics.net/lists/kvm/msg205198.html Take Intel vIOMMU as an example, there is a per device structure which includes IOMMUContext instance and a DualStageIOMMUObject pointer. +struct VTDIOMMUContext { + VTDBus *vtd_bus; + uint8_t devfn; + IOMMUContext iommu_context; + DualStageIOMMUObject *dsi_obj; + IntelIOMMUState *iommu_state; +}; https://www.spinics.net/lists/kvm/msg205196.html I think this would leave space for vendor specific vIOMMU emulators to design their own relationship between an IOMMUContext and a DualStageIOMMUObject. > > Cc: Kevin Tian <kevin.tian@xxxxxxxxx> > > Cc: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx> > > Cc: Peter Xu <peterx@xxxxxxxxxx> [...] > > + */ > > + > > +#include "qemu/osdep.h" > > +#include "hw/iommu/iommu_context.h" > > + > > +int iommu_context_register_ds_iommu(IOMMUContext *iommu_ctx, > > + DualStageIOMMUObject *dsi_obj) > > +{ > > + if (!iommu_ctx || !dsi_obj) { > > Would this ever happen apart from a bug in the caller? If not it > should be an assert(). Got it, thanks, I'll check all other alike in this series and fix them in next version. Thanks, Yi Liu