[igt-dev] [PATCH i-g-t v3 05/11] lib/vm_bind: Add prime_handle_to_fd_no_assert()
Matthew Auld
matthew.auld at intel.com
Wed Oct 12 08:39:40 UTC 2022
On 10/10/2022 07:59, Niranjana Vishwanathapura wrote:
> Make prime_handle_to_fd_no_assert() as a library interface
> as VM_BIND functionality will also be using it.
>
> Signed-off-by: Niranjana Vishwanathapura <niranjana.vishwanathapura at intel.com>
> ---
> lib/ioctl_wrappers.c | 39 +++++++++++++++++++++++++++++++++------
> lib/ioctl_wrappers.h | 1 +
> tests/prime_mmap.c | 26 ++++----------------------
> 3 files changed, 38 insertions(+), 28 deletions(-)
>
> diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
> index ac37b6bb43..bf7f5f430c 100644
> --- a/lib/ioctl_wrappers.c
> +++ b/lib/ioctl_wrappers.c
> @@ -1153,28 +1153,55 @@ void gem_require_mocs_registers(int fd)
> /* prime */
>
> /**
> - * prime_handle_to_fd:
> + * prime_handle_to_fd_no_assert:
> * @fd: open i915 drm file descriptor
> * @handle: file-private gem buffer object handle
> + * @flags: DRM_IOCTL_PRIME_HANDLE_TO_FD ioctl flags
> + * @fd_out: place holder for output file handle
> *
> * This wraps the PRIME_HANDLE_TO_FD ioctl, which is used to export a gem buffer
> * object into a global (i.e. potentially cross-device) dma-buf file-descriptor
> * handle.
> *
> - * Returns: The created dma-buf fd handle.
> + * Returns: 0 on sucess, error otherwise. Upon success, it returns
success
Reviewed-by: Matthew Auld <matthew.auld at intel.com>
> + * the created dma-buf fd handle in fd_out.
> */
> -int prime_handle_to_fd(int fd, uint32_t handle)
> +int prime_handle_to_fd_no_assert(int fd, uint32_t handle, int flags, int *fd_out)
> {
> struct drm_prime_handle args;
> + int ret;
>
> memset(&args, 0, sizeof(args));
> args.handle = handle;
> - args.flags = DRM_CLOEXEC;
> + args.flags = flags;
> args.fd = -1;
>
> - do_ioctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args);
> + ret = drmIoctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args);
> + if (ret)
> + ret = -errno;
> + *fd_out = args.fd;
>
> - return args.fd;
> + return ret;
> +}
> +
> +/**
> + * prime_handle_to_fd:
> + * @fd: open i915 drm file descriptor
> + * @handle: file-private gem buffer object handle
> + *
> + * This wraps the PRIME_HANDLE_TO_FD ioctl, which is used to export a gem buffer
> + * object into a global (i.e. potentially cross-device) dma-buf file-descriptor
> + * handle. It asserts that ioctl succeeds.
> + *
> + * Returns: The created dma-buf fd handle.
> + */
> +int prime_handle_to_fd(int fd, uint32_t handle)
> +{
> + int dmabuf;
> +
> + igt_assert_eq(prime_handle_to_fd_no_assert(fd, handle, DRM_CLOEXEC, &dmabuf), 0);
> +
> + return dmabuf;
> }
>
> /**
> diff --git a/lib/ioctl_wrappers.h b/lib/ioctl_wrappers.h
> index 223cd9160c..9f50a24153 100644
> --- a/lib/ioctl_wrappers.h
> +++ b/lib/ioctl_wrappers.h
> @@ -143,6 +143,7 @@ struct local_dma_buf_sync {
> #define LOCAL_DMA_BUF_BASE 'b'
> #define LOCAL_DMA_BUF_IOCTL_SYNC _IOW(LOCAL_DMA_BUF_BASE, 0, struct local_dma_buf_sync)
>
> +int prime_handle_to_fd_no_assert(int fd, uint32_t handle, int flags, int *fd_out);
> int prime_handle_to_fd(int fd, uint32_t handle);
> #ifndef DRM_RDWR
> #define DRM_RDWR O_RDWR
> diff --git a/tests/prime_mmap.c b/tests/prime_mmap.c
> index bc19f68c98..815921e762 100644
> --- a/tests/prime_mmap.c
> +++ b/tests/prime_mmap.c
> @@ -298,24 +298,6 @@ test_dup(uint32_t region, uint64_t size)
> close (dma_buf_fd);
> }
>
> -/* Used for error case testing to avoid wrapper */
> -static int prime_handle_to_fd_no_assert(uint32_t handle, int flags, int *fd_out)
> -{
> - struct drm_prime_handle args;
> - int ret;
> -
> - args.handle = handle;
> - args.flags = flags;
> - args.fd = -1;
> -
> - ret = drmIoctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args);
> - if (ret)
> - ret = errno;
> - *fd_out = args.fd;
> -
> - return ret;
> -}
> -
> static bool has_userptr(void)
> {
> uint32_t handle = 0;
> @@ -346,9 +328,9 @@ test_userptr(uint32_t region, uint64_t size)
> gem_userptr(fd, (uint32_t *)ptr, size, 0, 0, &handle);
>
> /* export userptr */
> - ret = prime_handle_to_fd_no_assert(handle, DRM_CLOEXEC, &dma_buf_fd);
> + ret = prime_handle_to_fd_no_assert(fd, handle, DRM_CLOEXEC, &dma_buf_fd);
> if (ret) {
> - igt_assert(ret == EINVAL || ret == ENODEV);
> + igt_assert(ret == -EINVAL || ret == -ENODEV);
> goto free_userptr;
> } else {
> igt_assert_eq(ret, 0);
> @@ -376,7 +358,7 @@ test_errors(uint32_t region, uint64_t size)
> /* Test for invalid flags */
> igt_assert(__gem_create_in_memory_regions(fd, &handle, &size, region) == 0);
> for (i = 0; i < ARRAY_SIZE(invalid_flags); i++) {
> - prime_handle_to_fd_no_assert(handle, invalid_flags[i], &dma_buf_fd);
> + prime_handle_to_fd_no_assert(fd, handle, invalid_flags[i], &dma_buf_fd);
> igt_assert_eq(errno, EINVAL);
> errno = 0;
> }
> @@ -386,7 +368,7 @@ test_errors(uint32_t region, uint64_t size)
> igt_assert(__gem_create_in_memory_regions(fd, &handle, &size, region) == 0);
> fill_bo(handle, size);
> gem_close(fd, handle);
> - prime_handle_to_fd_no_assert(handle, DRM_CLOEXEC, &dma_buf_fd);
> + prime_handle_to_fd_no_assert(fd, handle, DRM_CLOEXEC, &dma_buf_fd);
> igt_assert(dma_buf_fd == -1 && errno == ENOENT);
> errno = 0;
>
More information about the igt-dev
mailing list