Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dma-buf: allow reserving more than one shared fence slot

Let's support simultaneous submissions to multiple engines.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com>
Reviewed-by: Huang Rui <ray.huang@amd.com>
Link: https://patchwork.kernel.org/patch/10626149/

+28 -23
+8 -5
drivers/dma-buf/reservation.c
··· 56 56 EXPORT_SYMBOL(reservation_seqcount_string); 57 57 58 58 /** 59 - * reservation_object_reserve_shared - Reserve space to add a shared 60 - * fence to a reservation_object. 59 + * reservation_object_reserve_shared - Reserve space to add shared fences to 60 + * a reservation_object. 61 61 * @obj: reservation object 62 + * @num_fences: number of fences we want to add 62 63 * 63 64 * Should be called before reservation_object_add_shared_fence(). Must 64 65 * be called with obj->lock held. ··· 67 66 * RETURNS 68 67 * Zero for success, or -errno 69 68 */ 70 - int reservation_object_reserve_shared(struct reservation_object *obj) 69 + int reservation_object_reserve_shared(struct reservation_object *obj, 70 + unsigned int num_fences) 71 71 { 72 72 struct reservation_object_list *old, *new; 73 73 unsigned int i, j, k, max; ··· 76 74 old = reservation_object_get_list(obj); 77 75 78 76 if (old && old->shared_max) { 79 - if (old->shared_count < old->shared_max) 77 + if ((old->shared_count + num_fences) <= old->shared_max) 80 78 return 0; 81 79 else 82 - max = old->shared_max * 2; 80 + max = max(old->shared_count + num_fences, 81 + old->shared_max * 2); 83 82 } else { 84 83 max = 4; 85 84 }
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
··· 955 955 if (r) 956 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 959 if (r) 960 960 return r; 961 961
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
··· 640 640 bo_addr = amdgpu_bo_gpu_offset(bo); 641 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 644 if (r) 645 645 goto err; 646 646
+2 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
··· 772 772 773 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 776 if (r) 777 777 return r; 778 778 ··· 1839 1839 if (r) 1840 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 1843 if (r) 1844 1844 goto error_free; 1845 1845
+1 -1
drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
··· 179 179 struct reservation_object *robj = bo->obj->resv; 180 180 181 181 if (!(bo->flags & ETNA_SUBMIT_BO_WRITE)) { 182 - ret = reservation_object_reserve_shared(robj); 182 + ret = reservation_object_reserve_shared(robj, 1); 183 183 if (ret) 184 184 return ret; 185 185 }
+1 -1
drivers/gpu/drm/i915/i915_vma.c
··· 892 892 reservation_object_lock(resv, NULL); 893 893 if (flags & EXEC_OBJECT_WRITE) 894 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 896 reservation_object_add_shared_fence(resv, &rq->fence); 897 897 reservation_object_unlock(resv); 898 898 }
+2 -1
drivers/gpu/drm/msm/msm_gem_submit.c
··· 241 241 * strange place to call it. OTOH this is a 242 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 246 if (ret) 246 247 return ret; 247 248 }
+1 -1
drivers/gpu/drm/nouveau/nouveau_fence.c
··· 341 341 int ret = 0, i; 342 342 343 343 if (!exclusive) { 344 - ret = reservation_object_reserve_shared(resv); 344 + ret = reservation_object_reserve_shared(resv, 1); 345 345 346 346 if (ret) 347 347 return ret;
+1 -1
drivers/gpu/drm/qxl/qxl_release.c
··· 234 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 238 if (ret) 239 239 return ret; 240 240
+1 -1
drivers/gpu/drm/radeon/radeon_vm.c
··· 831 831 int r; 832 832 833 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 835 if (r) 836 836 return r; 837 837
+2 -2
drivers/gpu/drm/ttm/ttm_bo.c
··· 872 872 if (fence) { 873 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 876 if (unlikely(ret)) 877 877 return ret; 878 878 ··· 977 977 bool has_erestartsys = false; 978 978 int i, ret; 979 979 980 - ret = reservation_object_reserve_shared(bo->resv); 980 + ret = reservation_object_reserve_shared(bo->resv, 1); 981 981 if (unlikely(ret)) 982 982 return ret; 983 983
+2 -2
drivers/gpu/drm/ttm/ttm_execbuf_util.c
··· 129 129 if (!entry->shared) 130 130 continue; 131 131 132 - ret = reservation_object_reserve_shared(bo->resv); 132 + ret = reservation_object_reserve_shared(bo->resv, 1); 133 133 if (!ret) 134 134 continue; 135 135 } ··· 151 151 } 152 152 153 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 156 if (unlikely(ret != 0)) { 157 157 if (ret == -EINTR)
+1 -1
drivers/gpu/drm/v3d/v3d_gem.c
··· 305 305 for (i = 0; i < exec->bo_count; i++) { 306 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 309 if (ret) { 310 310 v3d_unlock_bo_reservations(dev, exec, acquire_ctx); 311 311 return ret;
+1 -1
drivers/gpu/drm/vc4/vc4_gem.c
··· 635 635 for (i = 0; i < exec->bo_count; i++) { 636 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 639 if (ret) { 640 640 vc4_unlock_bo_reservations(dev, exec, acquire_ctx); 641 641 return ret;
+1 -1
drivers/gpu/drm/vgem/vgem_fence.c
··· 180 180 reservation_object_lock(resv, NULL); 181 181 if (arg->flags & VGEM_FENCE_WRITE) 182 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 184 reservation_object_add_shared_fence(resv, fence); 185 185 reservation_object_unlock(resv); 186 186
+2 -1
include/linux/reservation.h
··· 261 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 266 void reservation_object_add_shared_fence(struct reservation_object *obj, 266 267 struct dma_fence *fence); 267 268