Message ID | 20230711025928.6438-21-yi.l.liu@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add vfio_device cdev for iommufd support | expand |
On Mon, Jul 10, 2023 at 07:59:22PM -0700, Yi Liu wrote: > It's common to get a reference to the iommufd context from a given file > descriptor. So adds an API for it. Existing users of this API are compiled > only when IOMMUFD is enabled, so no need to have a stub for the IOMMUFD > disabled case. > > Signed-off-by: Yi Liu <yi.l.liu@intel.com> > --- > drivers/iommu/iommufd/main.c | 23 +++++++++++++++++++++++ > include/linux/iommufd.h | 1 + > 2 files changed, 24 insertions(+) > > diff --git a/drivers/iommu/iommufd/main.c b/drivers/iommu/iommufd/main.c > index 32ce7befc8dd..e99a338d4fdf 100644 > --- a/drivers/iommu/iommufd/main.c > +++ b/drivers/iommu/iommufd/main.c > @@ -377,6 +377,29 @@ struct iommufd_ctx *iommufd_ctx_from_file(struct file *file) > } > EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_file, IOMMUFD); > > +/** > + * iommufd_ctx_from_fd - Acquires a reference to the iommufd context > + * @fd: File descriptor to obtain the reference from > + * > + * Returns a pointer to the iommufd_ctx, otherwise ERR_PTR. On success > + * the caller is responsible to call iommufd_ctx_put(). > + */ > +struct iommufd_ctx *iommufd_ctx_from_fd(int fd) > +{ > + struct iommufd_ctx *iommufd; > + struct fd f; > + > + f = fdget(fd); > + if (!f.file) > + return ERR_PTR(-EBADF); > + > + iommufd = iommufd_ctx_from_file(f.file); > + > + fdput(f); > + return iommufd; > +} > +EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_fd, IOMMUFD); This is a little wonky since iommufd_ctx_from_file() also obtains a reference Just needs to be like this: struct iommufd_ctx *iommufd_ctx_from_fd(int fd) { struct file *file; file = fget(fd); if (!file) return ERR_PTR(-EBADF); if (file->f_op != &iommufd_fops) { fput(file); return ERR_PTR(-EBADFD); } /* fget is the same as iommufd_ctx_get() */ return file->private_data; } EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_fd, IOMMUFD); ? Jason
> From: Jason Gunthorpe <jgg@nvidia.com> > Sent: Friday, July 14, 2023 10:21 PM > > On Mon, Jul 10, 2023 at 07:59:22PM -0700, Yi Liu wrote: > > It's common to get a reference to the iommufd context from a given file > > descriptor. So adds an API for it. Existing users of this API are compiled > > only when IOMMUFD is enabled, so no need to have a stub for the IOMMUFD > > disabled case. > > > > Signed-off-by: Yi Liu <yi.l.liu@intel.com> > > --- > > drivers/iommu/iommufd/main.c | 23 +++++++++++++++++++++++ > > include/linux/iommufd.h | 1 + > > 2 files changed, 24 insertions(+) > > > > diff --git a/drivers/iommu/iommufd/main.c b/drivers/iommu/iommufd/main.c > > index 32ce7befc8dd..e99a338d4fdf 100644 > > --- a/drivers/iommu/iommufd/main.c > > +++ b/drivers/iommu/iommufd/main.c > > @@ -377,6 +377,29 @@ struct iommufd_ctx *iommufd_ctx_from_file(struct file *file) > > } > > EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_file, IOMMUFD); > > > > +/** > > + * iommufd_ctx_from_fd - Acquires a reference to the iommufd context > > + * @fd: File descriptor to obtain the reference from > > + * > > + * Returns a pointer to the iommufd_ctx, otherwise ERR_PTR. On success > > + * the caller is responsible to call iommufd_ctx_put(). > > + */ > > +struct iommufd_ctx *iommufd_ctx_from_fd(int fd) > > +{ > > + struct iommufd_ctx *iommufd; > > + struct fd f; > > + > > + f = fdget(fd); > > + if (!f.file) > > + return ERR_PTR(-EBADF); > > + > > + iommufd = iommufd_ctx_from_file(f.file); > > + > > + fdput(f); > > + return iommufd; > > +} > > +EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_fd, IOMMUFD); > > This is a little wonky since iommufd_ctx_from_file() also obtains a > reference Yes. that's why need fdput() always. > Just needs to be like this: > > struct iommufd_ctx *iommufd_ctx_from_fd(int fd) > { > struct file *file; > > file = fget(fd); > if (!file) > return ERR_PTR(-EBADF); > > if (file->f_op != &iommufd_fops) { > fput(file); > return ERR_PTR(-EBADFD); > } > /* fget is the same as iommufd_ctx_get() */ > return file->private_data; > } > EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_fd, IOMMUFD); This one looks ok to me. Thanks. Regards, Yi Liu
diff --git a/drivers/iommu/iommufd/main.c b/drivers/iommu/iommufd/main.c index 32ce7befc8dd..e99a338d4fdf 100644 --- a/drivers/iommu/iommufd/main.c +++ b/drivers/iommu/iommufd/main.c @@ -377,6 +377,29 @@ struct iommufd_ctx *iommufd_ctx_from_file(struct file *file) } EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_file, IOMMUFD); +/** + * iommufd_ctx_from_fd - Acquires a reference to the iommufd context + * @fd: File descriptor to obtain the reference from + * + * Returns a pointer to the iommufd_ctx, otherwise ERR_PTR. On success + * the caller is responsible to call iommufd_ctx_put(). + */ +struct iommufd_ctx *iommufd_ctx_from_fd(int fd) +{ + struct iommufd_ctx *iommufd; + struct fd f; + + f = fdget(fd); + if (!f.file) + return ERR_PTR(-EBADF); + + iommufd = iommufd_ctx_from_file(f.file); + + fdput(f); + return iommufd; +} +EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_fd, IOMMUFD); + /** * iommufd_ctx_put - Put back a reference * @ictx: Context to put back diff --git a/include/linux/iommufd.h b/include/linux/iommufd.h index 3a3216cb9482..9657c58813dc 100644 --- a/include/linux/iommufd.h +++ b/include/linux/iommufd.h @@ -54,6 +54,7 @@ void iommufd_ctx_get(struct iommufd_ctx *ictx); #if IS_ENABLED(CONFIG_IOMMUFD) struct iommufd_ctx *iommufd_ctx_from_file(struct file *file); +struct iommufd_ctx *iommufd_ctx_from_fd(int fd); void iommufd_ctx_put(struct iommufd_ctx *ictx); bool iommufd_ctx_has_group(struct iommufd_ctx *ictx, struct iommu_group *group);
It's common to get a reference to the iommufd context from a given file descriptor. So adds an API for it. Existing users of this API are compiled only when IOMMUFD is enabled, so no need to have a stub for the IOMMUFD disabled case. Signed-off-by: Yi Liu <yi.l.liu@intel.com> --- drivers/iommu/iommufd/main.c | 23 +++++++++++++++++++++++ include/linux/iommufd.h | 1 + 2 files changed, 24 insertions(+)