A userptr doesn't have the obj->base.filp, but can be exported via dma-buf, so
make sure it fails when mmaping.

Signed-off-by: Tiago Vignatti <tiago.vignatti at intel.com>
---
In machine, export the handle to fd is actually returning error and falling
before the actual test happens. Same issue happens in gem_userptr_blits's
test_dmabuf(). This patch needs to be tested properly therefore.

 tests/prime_mmap.c | 38 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 37 insertions(+), 1 deletion(-)

diff --git a/tests/prime_mmap.c b/tests/prime_mmap.c
index ad91371..fd6d13b 100644
--- a/tests/prime_mmap.c
+++ b/tests/prime_mmap.c
@@ -299,12 +299,47 @@ static int prime_handle_to_fd_no_assert(uint32_t handle, 
int *fd_out)
        args.fd = -1;

        ret = drmIoctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args);
-
+       if (ret)
+               ret = errno;
        *fd_out = args.fd;

        return ret;
 }

+/* test for mmap(dma_buf_export(userptr)) */
+static void
+test_userptr(void)
+{
+       int ret, dma_buf_fd;
+       void *ptr;
+       uint32_t handle;
+
+       /* create userptr bo */
+       ret = posix_memalign(&ptr, 4096, BO_SIZE);
+       igt_assert_eq(ret, 0);
+
+       ret = gem_userptr(fd, (uint32_t *)ptr, BO_SIZE, 0, 
LOCAL_I915_USERPTR_UNSYNCHRONIZED, &handle);
+       igt_assert_eq(ret, 0);
+
+       /* export userptr */
+       ret = prime_handle_to_fd_no_assert(handle, &dma_buf_fd);
+       if (ret) {
+               igt_assert(ret == EINVAL || ret == ENODEV);
+               goto free_userptr;
+       } else {
+               igt_assert_eq(ret, 0);
+               igt_assert_lte(0, dma_buf_fd);
+       }
+
+       /* a userptr doesn't have the obj->base.filp, but can be exported via
+        * dma-buf, so make sure it fails here */
+       ptr = mmap(NULL, BO_SIZE, PROT_READ, MAP_SHARED, dma_buf_fd, 0);
+       igt_assert(ptr == MAP_FAILED && errno == ENODEV);
+free_userptr:
+       gem_close(fd, handle);
+       close(dma_buf_fd);
+}
+
 static void
 test_errors(void)
 {
@@ -413,6 +448,7 @@ igt_main
                { "test_forked_cpu_write", test_forked_cpu_write },
                { "test_refcounting", test_refcounting },
                { "test_dup", test_dup },
+               { "test_userptr", test_userptr },
                { "test_errors", test_errors },
                { "test_aperture_limit", test_aperture_limit },
        };
-- 
2.1.0

Reply via email to