hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/gpu/drm/vgem/vgem_fence.c
....@@ -21,7 +21,9 @@
2121 */
2222
2323 #include <linux/dma-buf.h>
24
-#include <linux/reservation.h>
24
+#include <linux/dma-resv.h>
25
+
26
+#include <drm/drm_file.h>
2527
2628 #include "vgem_drv.h"
2729
....@@ -43,16 +45,6 @@
4345 return "unbound";
4446 }
4547
46
-static bool vgem_fence_signaled(struct dma_fence *fence)
47
-{
48
- return false;
49
-}
50
-
51
-static bool vgem_fence_enable_signaling(struct dma_fence *fence)
52
-{
53
- return true;
54
-}
55
-
5648 static void vgem_fence_release(struct dma_fence *base)
5749 {
5850 struct vgem_fence *fence = container_of(base, typeof(*fence), base);
....@@ -63,22 +55,19 @@
6355
6456 static void vgem_fence_value_str(struct dma_fence *fence, char *str, int size)
6557 {
66
- snprintf(str, size, "%u", fence->seqno);
58
+ snprintf(str, size, "%llu", fence->seqno);
6759 }
6860
6961 static void vgem_fence_timeline_value_str(struct dma_fence *fence, char *str,
7062 int size)
7163 {
72
- snprintf(str, size, "%u",
64
+ snprintf(str, size, "%llu",
7365 dma_fence_is_signaled(fence) ? fence->seqno : 0);
7466 }
7567
7668 static const struct dma_fence_ops vgem_fence_ops = {
7769 .get_driver_name = vgem_fence_get_driver_name,
7870 .get_timeline_name = vgem_fence_get_timeline_name,
79
- .enable_signaling = vgem_fence_enable_signaling,
80
- .signaled = vgem_fence_signaled,
81
- .wait = dma_fence_default_wait,
8271 .release = vgem_fence_release,
8372
8473 .fence_value_str = vgem_fence_value_str,
....@@ -113,22 +102,6 @@
113102 return &fence->base;
114103 }
115104
116
-static int attach_dmabuf(struct drm_device *dev,
117
- struct drm_gem_object *obj)
118
-{
119
- struct dma_buf *dmabuf;
120
-
121
- if (obj->dma_buf)
122
- return 0;
123
-
124
- dmabuf = dev->driver->gem_prime_export(dev, obj, 0);
125
- if (IS_ERR(dmabuf))
126
- return PTR_ERR(dmabuf);
127
-
128
- obj->dma_buf = dmabuf;
129
- return 0;
130
-}
131
-
132105 /*
133106 * vgem_fence_attach_ioctl (DRM_IOCTL_VGEM_FENCE_ATTACH):
134107 *
....@@ -155,7 +128,7 @@
155128 {
156129 struct drm_vgem_fence_attach *arg = data;
157130 struct vgem_file *vfile = file->driver_priv;
158
- struct reservation_object *resv;
131
+ struct dma_resv *resv;
159132 struct drm_gem_object *obj;
160133 struct dma_fence *fence;
161134 int ret;
....@@ -170,10 +143,6 @@
170143 if (!obj)
171144 return -ENOENT;
172145
173
- ret = attach_dmabuf(dev, obj);
174
- if (ret)
175
- goto err;
176
-
177146 fence = vgem_fence_create(vfile, arg->flags);
178147 if (!fence) {
179148 ret = -ENOMEM;
....@@ -181,8 +150,8 @@
181150 }
182151
183152 /* Check for a conflicting fence */
184
- resv = obj->dma_buf->resv;
185
- if (!reservation_object_test_signaled_rcu(resv,
153
+ resv = obj->resv;
154
+ if (!dma_resv_test_signaled_rcu(resv,
186155 arg->flags & VGEM_FENCE_WRITE)) {
187156 ret = -EBUSY;
188157 goto err_fence;
....@@ -190,12 +159,12 @@
190159
191160 /* Expose the fence via the dma-buf */
192161 ret = 0;
193
- reservation_object_lock(resv, NULL);
162
+ dma_resv_lock(resv, NULL);
194163 if (arg->flags & VGEM_FENCE_WRITE)
195
- reservation_object_add_excl_fence(resv, fence);
196
- else if ((ret = reservation_object_reserve_shared(resv)) == 0)
197
- reservation_object_add_shared_fence(resv, fence);
198
- reservation_object_unlock(resv);
164
+ dma_resv_add_excl_fence(resv, fence);
165
+ else if ((ret = dma_resv_reserve_shared(resv, 1)) == 0)
166
+ dma_resv_add_shared_fence(resv, fence);
167
+ dma_resv_unlock(resv);
199168
200169 /* Record the fence in our idr for later signaling */
201170 if (ret == 0) {
....@@ -213,7 +182,7 @@
213182 dma_fence_put(fence);
214183 }
215184 err:
216
- drm_gem_object_put_unlocked(obj);
185
+ drm_gem_object_put(obj);
217186 return ret;
218187 }
219188
....@@ -280,4 +249,5 @@
280249 {
281250 idr_for_each(&vfile->fence_idr, __vgem_fence_idr_fini, vfile);
282251 idr_destroy(&vfile->fence_idr);
252
+ mutex_destroy(&vfile->fence_mutex);
283253 }