Try unsynchronized userptr if regular one fails. https://github.com/FreeBSDDesktop/kms-drm/issues/197 --- src/gallium/drivers/iris/iris_bufmgr.c.orig 2021-03-10 22:23:51 UTC +++ src/gallium/drivers/iris/iris_bufmgr.c @@ -624,8 +624,20 @@ iris_bo_create_userptr(struct iris_bufmgr *bufmgr, con .user_ptr = (uintptr_t)ptr, .user_size = size, }; - if (intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_USERPTR, &arg)) + + int ret; +retry: + ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_USERPTR, &arg); + if (ret) { + if (errno == ENODEV && arg.flags == 0) { + arg.flags = I915_USERPTR_UNSYNCHRONIZED; + goto retry; + } + if (geteuid() != 0) { + fprintf(stderr, "%s", "ioctl(I915_GEM_USERPTR) failed. Try running as root but expect poor stability.\n"); + } goto err_free; + } bo->gem_handle = arg.handle; /* Check the buffer for validity before we try and use it in a batch */ --- src/intel/vulkan/anv_gem.c.orig 2021-03-10 22:23:51 UTC +++ src/intel/vulkan/anv_gem.c @@ -146,9 +146,19 @@ anv_gem_userptr(struct anv_device *device, void *mem, .flags = 0, }; - int ret = intel_ioctl(device->fd, DRM_IOCTL_I915_GEM_USERPTR, &userptr); - if (ret == -1) + int ret; +retry: + ret = intel_ioctl(device->fd, DRM_IOCTL_I915_GEM_USERPTR, &userptr); + if (ret == -1) { + if (errno == ENODEV && userptr.flags == 0) { + userptr.flags = I915_USERPTR_UNSYNCHRONIZED; + goto retry; + } + if (geteuid() != 0) { + fprintf(stderr, "%s", "ioctl(I915_GEM_USERPTR) failed. Try running as root but expect poor stability.\n"); + } return 0; + } return userptr.handle; }