On Mon, Jun 16, 2025 at 02:54:10PM +0800, Baolu Lu wrote: > On 6/16/25 14:47, Nicolin Chen wrote: > > On Mon, Jun 16, 2025 at 02:12:04PM +0800, Baolu Lu wrote: > > > On 6/14/25 15:14, Nicolin Chen wrote: > > > > + if (!viommu->ops || !viommu->ops->get_hw_queue_size || > > > > + !viommu->ops->hw_queue_init_phys) { > > > > + rc = -EOPNOTSUPP; > > > > + goto out_put_viommu; > > > > + } > > Hmm, here it does abort when !viommu->ops->hw_queue_init_phys .. > > > > > > + /* > > > > + * FIXME once ops->hw_queue_init is introduced, this should check "if > > > > + * ops->hw_queue_init_phys". And "access" should be initialized to NULL. > > > > + */ > > > I just don't follow here. Up until now, only viommu->ops-> > > > hw_queue_init_phys has been added, which means the current code only > > > supports hardware queues that access guest memory using physical > > > addresses. The access object is not needed for the other type of > > > hardware queue that uses guest IOVA. > > > > > > So, why not just abort here if ops->hw_queue_init_phys is not supported > > > by the IOMMU driver? > > .. so, it already does. > > > > > Leave other logics to the patches that introduce > > > ops->hw_queue_init? I guess that would make this patch more readible. > > The patch is doing in the way to support the hw_queue_init_phys > > case only. It is just adding some extra FIXMEs as the guideline > > for the future patch adding hw_queue_init op. > > > > I personally don't feel these are confusing. Maybe you can help > > point out what specific wording feels odd here? Maybe "FIXME"s > > should be "TODO"s? > > Oh, I probably misunderstood the logic here. For both hw_queue_init and > hw_queue_init_phys, using an access object to pin the pages for hardware > access is necessary, right? My understanding was that pinning pages is > only required for hw_queue_init_phys. No. The access is only used by the ops->hw_queue_init_phys case. The ops->hw_queue_init case will use the cmd->nesting_parent_iova directly without calling iommufd_hw_queue_alloc_phys(). This FIXME means that, when adding ops->hw_queue_init, add this: - struct iommufd_access *access; + struct iommufd_access *access = NULL; ... - access = iommufd_hw_queue_alloc_phys(cmd, viommu, &base_pa); + if (ops->hw_queue_init_phys) { + access = iommufd_hw_queue_alloc_phys(cmd, viommu, &base_pa); Also, the other FIXME guideline states that these two ops should be mutually exclusive. So, add this too: + if (WARN_ON_ONCE(ops->hw_queue_init && + ops->hw_queue_init_phys)) { + rc = -EOPNOTSUPP; Thanks Nicolin