summaryrefslogtreecommitdiff
path: root/graphics/mesa-devel/files/patch-userptr
blob: f73abcd5d1edd63de5093dcf2ba03311f0433d3b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Try unsynchronized userptr if regular one fails.
https://github.com/FreeBSDDesktop/kms-drm/issues/197

--- src/gallium/drivers/crocus/crocus_bufmgr.c.orig	2021-06-30 22:34:42 UTC
+++ src/gallium/drivers/crocus/crocus_bufmgr.c
@@ -493,8 +493,20 @@ crocus_bo_create_userptr(struct crocus_bufmgr *bufmgr,
       .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/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;
 }