Since dmabuf only has APIs that work on an int fd and not a struct file *,
pass the fd deeper into the call chain so we can use the dmabuf APIs as
is.

Reviewed-by: Nicolin Chen <[email protected]>
Reviewed-by: Kevin Tian <[email protected]>
Tested-by: Nicolin Chen <[email protected]>
Tested-by: Shuai Xue <[email protected]>
Signed-off-by: Jason Gunthorpe <[email protected]>
---
 drivers/iommu/iommufd/io_pagetable.c    | 15 +++++++++++----
 drivers/iommu/iommufd/ioas.c            |  8 +-------
 drivers/iommu/iommufd/iommufd_private.h |  2 +-
 3 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/drivers/iommu/iommufd/io_pagetable.c 
b/drivers/iommu/iommufd/io_pagetable.c
index a120c2ae942a8b..0bf6ca77888c0f 100644
--- a/drivers/iommu/iommufd/io_pagetable.c
+++ b/drivers/iommu/iommufd/io_pagetable.c
@@ -10,6 +10,7 @@
  */
 #include <linux/err.h>
 #include <linux/errno.h>
+#include <linux/file.h>
 #include <linux/iommu.h>
 #include <linux/iommufd.h>
 #include <linux/lockdep.h>
@@ -471,21 +472,27 @@ int iopt_map_user_pages(struct iommufd_ctx *ictx, struct 
io_pagetable *iopt,
  * @iopt: io_pagetable to act on
  * @iova: If IOPT_ALLOC_IOVA is set this is unused on input and contains
  *        the chosen iova on output. Otherwise is the iova to map to on input
- * @file: file to map
+ * @fd: fdno of a file to map
  * @start: map file starting at this byte offset
  * @length: Number of bytes to map
  * @iommu_prot: Combination of IOMMU_READ/WRITE/etc bits for the mapping
  * @flags: IOPT_ALLOC_IOVA or zero
  */
 int iopt_map_file_pages(struct iommufd_ctx *ictx, struct io_pagetable *iopt,
-                       unsigned long *iova, struct file *file,
-                       unsigned long start, unsigned long length,
-                       int iommu_prot, unsigned int flags)
+                       unsigned long *iova, int fd, unsigned long start,
+                       unsigned long length, int iommu_prot,
+                       unsigned int flags)
 {
        struct iopt_pages *pages;
+       struct file *file;
+
+       file = fget(fd);
+       if (!file)
+               return -EBADF;
 
        pages = iopt_alloc_file_pages(file, start, length,
                                      iommu_prot & IOMMU_WRITE);
+       fput(file);
        if (IS_ERR(pages))
                return PTR_ERR(pages);
        return iopt_map_common(ictx, iopt, pages, iova, length,
diff --git a/drivers/iommu/iommufd/ioas.c b/drivers/iommu/iommufd/ioas.c
index 1542c5fd10a85c..0dee38d7252df4 100644
--- a/drivers/iommu/iommufd/ioas.c
+++ b/drivers/iommu/iommufd/ioas.c
@@ -207,7 +207,6 @@ int iommufd_ioas_map_file(struct iommufd_ucmd *ucmd)
        unsigned long iova = cmd->iova;
        struct iommufd_ioas *ioas;
        unsigned int flags = 0;
-       struct file *file;
        int rc;
 
        if (cmd->flags &
@@ -229,11 +228,7 @@ int iommufd_ioas_map_file(struct iommufd_ucmd *ucmd)
        if (!(cmd->flags & IOMMU_IOAS_MAP_FIXED_IOVA))
                flags = IOPT_ALLOC_IOVA;
 
-       file = fget(cmd->fd);
-       if (!file)
-               return -EBADF;
-
-       rc = iopt_map_file_pages(ucmd->ictx, &ioas->iopt, &iova, file,
+       rc = iopt_map_file_pages(ucmd->ictx, &ioas->iopt, &iova, cmd->fd,
                                 cmd->start, cmd->length,
                                 conv_iommu_prot(cmd->flags), flags);
        if (rc)
@@ -243,7 +238,6 @@ int iommufd_ioas_map_file(struct iommufd_ucmd *ucmd)
        rc = iommufd_ucmd_respond(ucmd, sizeof(*cmd));
 out_put:
        iommufd_put_object(ucmd->ictx, &ioas->obj);
-       fput(file);
        return rc;
 }
 
diff --git a/drivers/iommu/iommufd/iommufd_private.h 
b/drivers/iommu/iommufd/iommufd_private.h
index 10ee3510312132..a2786fee7603f5 100644
--- a/drivers/iommu/iommufd/iommufd_private.h
+++ b/drivers/iommu/iommufd/iommufd_private.h
@@ -108,7 +108,7 @@ int iopt_map_user_pages(struct iommufd_ctx *ictx, struct 
io_pagetable *iopt,
                        unsigned long length, int iommu_prot,
                        unsigned int flags);
 int iopt_map_file_pages(struct iommufd_ctx *ictx, struct io_pagetable *iopt,
-                       unsigned long *iova, struct file *file,
+                       unsigned long *iova, int fd,
                        unsigned long start, unsigned long length,
                        int iommu_prot, unsigned int flags);
 int iopt_map_pages(struct io_pagetable *iopt, struct list_head *pages_list,
-- 
2.43.0

Reply via email to