[igt-dev] [PATCH i-g-t v3 05/11] lib/vm_bind: Add prime_handle_to_fd_no_assert()

Niranjana Vishwanathapura niranjana.vishwanathapura at intel.com
Wed Oct 12 21:39:24 UTC 2022


On Wed, Oct 12, 2022 at 09:39:40AM +0100, Matthew Auld wrote:
>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>
>

Will fix.

Thanks,
Niranjana

>>+ *          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