summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/dma-buf/reservation.c13
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c4
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c2
-rw-r--r--drivers/gpu/drm/i915/i915_vma.c2
-rw-r--r--drivers/gpu/drm/msm/msm_gem_submit.c3
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_fence.c2
-rw-r--r--drivers/gpu/drm/qxl/qxl_release.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_vm.c2
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo.c4
-rw-r--r--drivers/gpu/drm/ttm/ttm_execbuf_util.c4
-rw-r--r--drivers/gpu/drm/v3d/v3d_gem.c2
-rw-r--r--drivers/gpu/drm/vc4/vc4_gem.c2
-rw-r--r--drivers/gpu/drm/vgem/vgem_fence.c2
-rw-r--r--include/linux/reservation.h3
16 files changed, 28 insertions, 23 deletions
diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c
index 5825fc336a13..5fb4fd461908 100644
--- a/drivers/dma-buf/reservation.c
+++ b/drivers/dma-buf/reservation.c
@@ -56,9 +56,10 @@ const char reservation_seqcount_string[] = "reservation_seqcount";
56EXPORT_SYMBOL(reservation_seqcount_string); 56EXPORT_SYMBOL(reservation_seqcount_string);
57 57
58/** 58/**
59 * reservation_object_reserve_shared - Reserve space to add a shared 59 * reservation_object_reserve_shared - Reserve space to add shared fences to
60 * fence to a reservation_object. 60 * a reservation_object.
61 * @obj: reservation object 61 * @obj: reservation object
62 * @num_fences: number of fences we want to add
62 * 63 *
63 * Should be called before reservation_object_add_shared_fence(). Must 64 * Should be called before reservation_object_add_shared_fence(). Must
64 * be called with obj->lock held. 65 * be called with obj->lock held.
@@ -66,7 +67,8 @@ EXPORT_SYMBOL(reservation_seqcount_string);
66 * RETURNS 67 * RETURNS
67 * Zero for success, or -errno 68 * Zero for success, or -errno
68 */ 69 */
69int reservation_object_reserve_shared(struct reservation_object *obj) 70int reservation_object_reserve_shared(struct reservation_object *obj,
71 unsigned int num_fences)
70{ 72{
71 struct reservation_object_list *old, *new; 73 struct reservation_object_list *old, *new;
72 unsigned int i, j, k, max; 74 unsigned int i, j, k, max;
@@ -74,10 +76,11 @@ int reservation_object_reserve_shared(struct reservation_object *obj)
74 old = reservation_object_get_list(obj); 76 old = reservation_object_get_list(obj);
75 77
76 if (old && old->shared_max) { 78 if (old && old->shared_max) {
77 if (old->shared_count < old->shared_max) 79 if ((old->shared_count + num_fences) <= old->shared_max)
78 return 0; 80 return 0;
79 else 81 else
80 max = old->shared_max * 2; 82 max = max(old->shared_count + num_fences,
83 old->shared_max * 2);
81 } else { 84 } else {
82 max = 4; 85 max = 4;
83 } 86 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 8e9a65a15875..35bc8fc3bc70 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -955,7 +955,7 @@ static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p)
955 if (r) 955 if (r)
956 return r; 956 return r;
957 957
958 r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv); 958 r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv, 1);
959 if (r) 959 if (r)
960 return r; 960 return r;
961 961
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 904014dc5915..cf768acb51dc 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -640,7 +640,7 @@ int amdgpu_bo_backup_to_shadow(struct amdgpu_device *adev,
640 bo_addr = amdgpu_bo_gpu_offset(bo); 640 bo_addr = amdgpu_bo_gpu_offset(bo);
641 shadow_addr = amdgpu_bo_gpu_offset(bo->shadow); 641 shadow_addr = amdgpu_bo_gpu_offset(bo->shadow);
642 642
643 r = reservation_object_reserve_shared(bo->tbo.resv); 643 r = reservation_object_reserve_shared(bo->tbo.resv, 1);
644 if (r) 644 if (r)
645 goto err; 645 goto err;
646 646
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 6904d794d60a..bdce05183edb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -772,7 +772,7 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,
772 772
773 ring = container_of(vm->entity.rq->sched, struct amdgpu_ring, sched); 773 ring = container_of(vm->entity.rq->sched, struct amdgpu_ring, sched);
774 774
775 r = reservation_object_reserve_shared(bo->tbo.resv); 775 r = reservation_object_reserve_shared(bo->tbo.resv, 1);
776 if (r) 776 if (r)
777 return r; 777 return r;
778 778
@@ -1839,7 +1839,7 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
1839 if (r) 1839 if (r)
1840 goto error_free; 1840 goto error_free;
1841 1841
1842 r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv); 1842 r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv, 1);
1843 if (r) 1843 if (r)
1844 goto error_free; 1844 goto error_free;
1845 1845
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index 983e67f19e45..30875f8f2933 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -179,7 +179,7 @@ static int submit_fence_sync(struct etnaviv_gem_submit *submit)
179 struct reservation_object *robj = bo->obj->resv; 179 struct reservation_object *robj = bo->obj->resv;
180 180
181 if (!(bo->flags & ETNA_SUBMIT_BO_WRITE)) { 181 if (!(bo->flags & ETNA_SUBMIT_BO_WRITE)) {
182 ret = reservation_object_reserve_shared(robj); 182 ret = reservation_object_reserve_shared(robj, 1);
183 if (ret) 183 if (ret)
184 return ret; 184 return ret;
185 } 185 }
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
index 31efc971a3a8..35fce4c88629 100644
--- a/drivers/gpu/drm/i915/i915_vma.c
+++ b/drivers/gpu/drm/i915/i915_vma.c
@@ -892,7 +892,7 @@ static void export_fence(struct i915_vma *vma,
892 reservation_object_lock(resv, NULL); 892 reservation_object_lock(resv, NULL);
893 if (flags & EXEC_OBJECT_WRITE) 893 if (flags & EXEC_OBJECT_WRITE)
894 reservation_object_add_excl_fence(resv, &rq->fence); 894 reservation_object_add_excl_fence(resv, &rq->fence);
895 else if (reservation_object_reserve_shared(resv) == 0) 895 else if (reservation_object_reserve_shared(resv, 1) == 0)
896 reservation_object_add_shared_fence(resv, &rq->fence); 896 reservation_object_add_shared_fence(resv, &rq->fence);
897 reservation_object_unlock(resv); 897 reservation_object_unlock(resv);
898} 898}
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
index 7a7923e6220d..a90aedd6883a 100644
--- a/drivers/gpu/drm/msm/msm_gem_submit.c
+++ b/drivers/gpu/drm/msm/msm_gem_submit.c
@@ -241,7 +241,8 @@ static int submit_fence_sync(struct msm_gem_submit *submit, bool no_implicit)
241 * strange place to call it. OTOH this is a 241 * strange place to call it. OTOH this is a
242 * convenient can-fail point to hook it in. 242 * convenient can-fail point to hook it in.
243 */ 243 */
244 ret = reservation_object_reserve_shared(msm_obj->resv); 244 ret = reservation_object_reserve_shared(msm_obj->resv,
245 1);
245 if (ret) 246 if (ret)
246 return ret; 247 return ret;
247 } 248 }
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c
index 99be61ddeb75..d4964f3397a1 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
@@ -341,7 +341,7 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool e
341 int ret = 0, i; 341 int ret = 0, i;
342 342
343 if (!exclusive) { 343 if (!exclusive) {
344 ret = reservation_object_reserve_shared(resv); 344 ret = reservation_object_reserve_shared(resv, 1);
345 345
346 if (ret) 346 if (ret)
347 return ret; 347 return ret;
diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c
index e37f0097f744..a8d5457a1af9 100644
--- a/drivers/gpu/drm/qxl/qxl_release.c
+++ b/drivers/gpu/drm/qxl/qxl_release.c
@@ -234,7 +234,7 @@ static int qxl_release_validate_bo(struct qxl_bo *bo)
234 return ret; 234 return ret;
235 } 235 }
236 236
237 ret = reservation_object_reserve_shared(bo->tbo.resv); 237 ret = reservation_object_reserve_shared(bo->tbo.resv, 1);
238 if (ret) 238 if (ret)
239 return ret; 239 return ret;
240 240
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index 7f1a9c787bd1..fed11ece0de6 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -831,7 +831,7 @@ static int radeon_vm_update_ptes(struct radeon_device *rdev,
831 int r; 831 int r;
832 832
833 radeon_sync_resv(rdev, &ib->sync, pt->tbo.resv, true); 833 radeon_sync_resv(rdev, &ib->sync, pt->tbo.resv, true);
834 r = reservation_object_reserve_shared(pt->tbo.resv); 834 r = reservation_object_reserve_shared(pt->tbo.resv, 1);
835 if (r) 835 if (r)
836 return r; 836 return r;
837 837
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 26b889f86670..83b4657ffb10 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -872,7 +872,7 @@ static int ttm_bo_add_move_fence(struct ttm_buffer_object *bo,
872 if (fence) { 872 if (fence) {
873 reservation_object_add_shared_fence(bo->resv, fence); 873 reservation_object_add_shared_fence(bo->resv, fence);
874 874
875 ret = reservation_object_reserve_shared(bo->resv); 875 ret = reservation_object_reserve_shared(bo->resv, 1);
876 if (unlikely(ret)) 876 if (unlikely(ret))
877 return ret; 877 return ret;
878 878
@@ -977,7 +977,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
977 bool has_erestartsys = false; 977 bool has_erestartsys = false;
978 int i, ret; 978 int i, ret;
979 979
980 ret = reservation_object_reserve_shared(bo->resv); 980 ret = reservation_object_reserve_shared(bo->resv, 1);
981 if (unlikely(ret)) 981 if (unlikely(ret))
982 return ret; 982 return ret;
983 983
diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
index e73ae0d22897..e493edb0d3e7 100644
--- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
+++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
@@ -129,7 +129,7 @@ int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
129 if (!entry->shared) 129 if (!entry->shared)
130 continue; 130 continue;
131 131
132 ret = reservation_object_reserve_shared(bo->resv); 132 ret = reservation_object_reserve_shared(bo->resv, 1);
133 if (!ret) 133 if (!ret)
134 continue; 134 continue;
135 } 135 }
@@ -151,7 +151,7 @@ int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
151 } 151 }
152 152
153 if (!ret && entry->shared) 153 if (!ret && entry->shared)
154 ret = reservation_object_reserve_shared(bo->resv); 154 ret = reservation_object_reserve_shared(bo->resv, 1);
155 155
156 if (unlikely(ret != 0)) { 156 if (unlikely(ret != 0)) {
157 if (ret == -EINTR) 157 if (ret == -EINTR)
diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c
index e688369ca82b..b88c96911453 100644
--- a/drivers/gpu/drm/v3d/v3d_gem.c
+++ b/drivers/gpu/drm/v3d/v3d_gem.c
@@ -305,7 +305,7 @@ retry:
305 for (i = 0; i < exec->bo_count; i++) { 305 for (i = 0; i < exec->bo_count; i++) {
306 bo = to_v3d_bo(&exec->bo[i]->base); 306 bo = to_v3d_bo(&exec->bo[i]->base);
307 307
308 ret = reservation_object_reserve_shared(bo->resv); 308 ret = reservation_object_reserve_shared(bo->resv, 1);
309 if (ret) { 309 if (ret) {
310 v3d_unlock_bo_reservations(dev, exec, acquire_ctx); 310 v3d_unlock_bo_reservations(dev, exec, acquire_ctx);
311 return ret; 311 return ret;
diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
index 251198194c38..41881ce4132d 100644
--- a/drivers/gpu/drm/vc4/vc4_gem.c
+++ b/drivers/gpu/drm/vc4/vc4_gem.c
@@ -635,7 +635,7 @@ retry:
635 for (i = 0; i < exec->bo_count; i++) { 635 for (i = 0; i < exec->bo_count; i++) {
636 bo = to_vc4_bo(&exec->bo[i]->base); 636 bo = to_vc4_bo(&exec->bo[i]->base);
637 637
638 ret = reservation_object_reserve_shared(bo->resv); 638 ret = reservation_object_reserve_shared(bo->resv, 1);
639 if (ret) { 639 if (ret) {
640 vc4_unlock_bo_reservations(dev, exec, acquire_ctx); 640 vc4_unlock_bo_reservations(dev, exec, acquire_ctx);
641 return ret; 641 return ret;
diff --git a/drivers/gpu/drm/vgem/vgem_fence.c b/drivers/gpu/drm/vgem/vgem_fence.c
index e6ee71323a66..c1c420afe2dd 100644
--- a/drivers/gpu/drm/vgem/vgem_fence.c
+++ b/drivers/gpu/drm/vgem/vgem_fence.c
@@ -180,7 +180,7 @@ int vgem_fence_attach_ioctl(struct drm_device *dev,
180 reservation_object_lock(resv, NULL); 180 reservation_object_lock(resv, NULL);
181 if (arg->flags & VGEM_FENCE_WRITE) 181 if (arg->flags & VGEM_FENCE_WRITE)
182 reservation_object_add_excl_fence(resv, fence); 182 reservation_object_add_excl_fence(resv, fence);
183 else if ((ret = reservation_object_reserve_shared(resv)) == 0) 183 else if ((ret = reservation_object_reserve_shared(resv, 1)) == 0)
184 reservation_object_add_shared_fence(resv, fence); 184 reservation_object_add_shared_fence(resv, fence);
185 reservation_object_unlock(resv); 185 reservation_object_unlock(resv);
186 186
diff --git a/include/linux/reservation.h b/include/linux/reservation.h
index 54cf6773a14c..5ddb0e143721 100644
--- a/include/linux/reservation.h
+++ b/include/linux/reservation.h
@@ -261,7 +261,8 @@ reservation_object_get_excl_rcu(struct reservation_object *obj)
261 return fence; 261 return fence;
262} 262}
263 263
264int reservation_object_reserve_shared(struct reservation_object *obj); 264int reservation_object_reserve_shared(struct reservation_object *obj,
265 unsigned int num_fences);
265void reservation_object_add_shared_fence(struct reservation_object *obj, 266void reservation_object_add_shared_fence(struct reservation_object *obj,
266 struct dma_fence *fence); 267 struct dma_fence *fence);
267 268