diff options
-rw-r--r-- | drivers/dma-buf/reservation.c | 13 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_vma.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_gem_submit.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_fence.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_release.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_vm.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/ttm/ttm_execbuf_util.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/v3d/v3d_gem.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_gem.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/vgem/vgem_fence.c | 2 | ||||
-rw-r--r-- | include/linux/reservation.h | 3 |
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"; | |||
56 | EXPORT_SYMBOL(reservation_seqcount_string); | 56 | EXPORT_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 | */ |
69 | int reservation_object_reserve_shared(struct reservation_object *obj) | 70 | int 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 | ||
264 | int reservation_object_reserve_shared(struct reservation_object *obj); | 264 | int reservation_object_reserve_shared(struct reservation_object *obj, |
265 | unsigned int num_fences); | ||
265 | void reservation_object_add_shared_fence(struct reservation_object *obj, | 266 | void reservation_object_add_shared_fence(struct reservation_object *obj, |
266 | struct dma_fence *fence); | 267 | struct dma_fence *fence); |
267 | 268 | ||