On Tue, Dec 12, 2023 at 12:05:41PM -0800, Nicolin Chen wrote: > > > // iommufd_private.h > > > > > > enum iommufd_object_type { > > > ... > > > + IOMMUFD_OBJ_VIOMMU, > > > ... > > > }; > > > > > > +struct iommufd_viommu { > > > + struct iommufd_object obj; > > > + struct iommufd_hwpt_paging *hwpt; > > > + struct xarray devices; > > > +}; > > > > > > struct iommufd_hwpt_paging hwpt { > > > ... > > > + struct list_head viommu_list; > > > ... > > > }; > > > > I'd probably first try to go backwards and link the hwpt to the > > viommu. > > I think a VM should have only one hwpt_paging object while one > or more viommu objects, so we could do only viommu->hwpt_paging > and hwpt_paging->viommu_list. How to go backwards? That is probably how things would work but I don't know if it makes sense to enforce it in the kernel logic.. Point the S2 to a list of viommu objects it is linked to > > > struct iommufd_group { > > > ... > > > + struct iommufd_viommu *viommu; // should we attach to viommu instead of hwpt? > > > ... > > > }; > > > > No. Attach is a statement of translation so you still attach to the HWPT. > > OK. It's probably not necessary since we know which piommu the > device is behind. And we only need to link viommu and piommu, > right? Yes > > The second version maybe we have the xarray, or maybe we just push the > > xarray to the eventual viommu series. > > I think that I still don't get the purpose of the xarray here. > It was needed previously because a cache invalidate per hwpt > doesn't know which device. Now IOMMUFD_DEV_INVALIDATE knows. > > Maybe it's related to that narrative "logically we could have > multiple mappings per iommufd" that you mentioned above. Mind > elaborating a bit? > > In my mind, viommu is allocated by VMM per piommu, by detecting > the piommu_id via hw_info. In that case, viommu can only have > one unique device list. If IOMMUFD_DEV_INVALIDATE passes in the > dev_id, we don't really need a mapping of vRID-pRID in a multi- > viommu case either? In another word, VMM already has a mapping > from vRID to dev_id, so it could call the DEV_INVALIDATE ioctl > in the first place? The xarray exists to optimize the invalidation flow. For SW you can imagine issuing an invalidation against the viommu itself and *all* commands, be they ASID or ATC invalidations can be processed in one shot. The xarray allows converting the vSID to pSID to process ATC invalidations, and the viommu object forces a single VMID to handle the ATC invalidations. If we want to do this, I don't know. For HW, the xarray holds the vSID to pSID mapping that must be programmed into the HW operating the dedicated invalidation queue. Jason