Message ID | 20230511143844.22693-2-yi.l.liu@intel.com |
---|---|
State | New |
Headers | show |
Series | iommufd: Add nesting infrastructure | expand |
> From: Liu, Yi L <yi.l.liu@intel.com> > Sent: Thursday, May 11, 2023 10:39 PM > @@ -229,6 +238,15 @@ struct iommu_iotlb_gather { > * after use. Return the data buffer if success, or ERR_PTR on > * failure. > * @domain_alloc: allocate iommu domain > + * @domain_alloc_user: allocate user iommu domain > + * @domain_alloc_user_data_len: return the required length of the user > data > + * to allocate a specific type user iommu domain. > + * @hwpt_type is defined as enum iommu_hwpt_type > + * in include/uapi/linux/iommufd.h. The returned > + * length is the corresponding sizeof driver data > + * structures in include/uapi/linux/iommufd.h. > + * -EOPNOTSUPP would be returned if the input > + * @hwpt_type is not supported by the driver. Can this be merged with earlier @hw_info callback? That will already report a list of supported hwpt types. is there a problem to further describe the data length for each type in that interface?
On Wed, May 24, 2023 at 06:41:41PM -0700, Nicolin Chen wrote: > Upon a quick check, I think we could. Though it'd be slightly > mismatched with the domain_alloc op, it should be fine since > iommufd is likely to be the only caller. Ideally the main op would return ERR_PTR too Jason
On Tue, Jun 06, 2023 at 11:08:44AM -0300, Jason Gunthorpe wrote: > On Wed, May 24, 2023 at 06:41:41PM -0700, Nicolin Chen wrote: > > > Upon a quick check, I think we could. Though it'd be slightly > > mismatched with the domain_alloc op, it should be fine since > > iommufd is likely to be the only caller. > > Ideally the main op would return ERR_PTR too Yea. It just seems to be a bit painful to change it for that. Worth a big series? Thanks Nic
On Tue, Jun 06, 2023 at 12:43:44PM -0700, Nicolin Chen wrote: > On Tue, Jun 06, 2023 at 11:08:44AM -0300, Jason Gunthorpe wrote: > > On Wed, May 24, 2023 at 06:41:41PM -0700, Nicolin Chen wrote: > > > > > Upon a quick check, I think we could. Though it'd be slightly > > > mismatched with the domain_alloc op, it should be fine since > > > iommufd is likely to be the only caller. > > > > Ideally the main op would return ERR_PTR too > > Yea. It just seems to be a bit painful to change it for that. > > Worth a big series? Probably not.. Jason
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index a748d60206e7..7f2046fa53a3 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -220,6 +220,15 @@ struct iommu_iotlb_gather { bool queued; }; +/* + * The user data to allocate a specific type user iommu domain + * + * This includes the corresponding driver data structures in + * include/uapi/linux/iommufd.h. + */ +union iommu_domain_user_data { +}; + /** * struct iommu_ops - iommu ops and capabilities * @capable: check capability @@ -229,6 +238,15 @@ struct iommu_iotlb_gather { * after use. Return the data buffer if success, or ERR_PTR on * failure. * @domain_alloc: allocate iommu domain + * @domain_alloc_user: allocate user iommu domain + * @domain_alloc_user_data_len: return the required length of the user data + * to allocate a specific type user iommu domain. + * @hwpt_type is defined as enum iommu_hwpt_type + * in include/uapi/linux/iommufd.h. The returned + * length is the corresponding sizeof driver data + * structures in include/uapi/linux/iommufd.h. + * -EOPNOTSUPP would be returned if the input + * @hwpt_type is not supported by the driver. * @probe_device: Add device to iommu driver handling * @release_device: Remove device from iommu driver handling * @probe_finalize: Do final setup work after the device is added to an IOMMU @@ -269,6 +287,10 @@ struct iommu_ops { /* Domain allocation and freeing by the iommu driver */ struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type); + struct iommu_domain *(*domain_alloc_user)(struct device *dev, + struct iommu_domain *parent, + const union iommu_domain_user_data *user_data); + int (*domain_alloc_user_data_len)(u32 hwpt_type); struct iommu_device *(*probe_device)(struct device *dev); void (*release_device)(struct device *dev);