Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca05359f authored by Christian König's avatar Christian König
Browse files

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



Let's support simultaneous submissions to multiple engines.

Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarMichel Dänzer <michel.daenzer@amd.com>
Reviewed-by: default avatarJunwei Zhang <Jerry.Zhang@amd.com>
Reviewed-by: default avatarHuang Rui <ray.huang@amd.com>
Link: https://patchwork.kernel.org/patch/10626149/
parent 27836b64
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -56,9 +56,10 @@ const char reservation_seqcount_string[] = "reservation_seqcount";
EXPORT_SYMBOL(reservation_seqcount_string);

/**
 * reservation_object_reserve_shared - Reserve space to add a shared
 * fence to a reservation_object.
 * reservation_object_reserve_shared - Reserve space to add shared fences to
 * a reservation_object.
 * @obj: reservation object
 * @num_fences: number of fences we want to add
 *
 * Should be called before reservation_object_add_shared_fence().  Must
 * be called with obj->lock held.
@@ -66,7 +67,8 @@ EXPORT_SYMBOL(reservation_seqcount_string);
 * RETURNS
 * Zero for success, or -errno
 */
int reservation_object_reserve_shared(struct reservation_object *obj)
int reservation_object_reserve_shared(struct reservation_object *obj,
				      unsigned int num_fences)
{
	struct reservation_object_list *old, *new;
	unsigned int i, j, k, max;
@@ -74,10 +76,11 @@ int reservation_object_reserve_shared(struct reservation_object *obj)
	old = reservation_object_get_list(obj);

	if (old && old->shared_max) {
		if (old->shared_count < old->shared_max)
		if ((old->shared_count + num_fences) <= old->shared_max)
			return 0;
		else
			max = old->shared_max * 2;
			max = max(old->shared_count + num_fences,
				  old->shared_max * 2);
	} else {
		max = 4;
	}
+1 −1
Original line number Diff line number Diff line
@@ -955,7 +955,7 @@ static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p)
	if (r)
		return r;

	r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv);
	r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv, 1);
	if (r)
		return r;

+1 −1
Original line number Diff line number Diff line
@@ -640,7 +640,7 @@ int amdgpu_bo_backup_to_shadow(struct amdgpu_device *adev,
	bo_addr = amdgpu_bo_gpu_offset(bo);
	shadow_addr = amdgpu_bo_gpu_offset(bo->shadow);

	r = reservation_object_reserve_shared(bo->tbo.resv);
	r = reservation_object_reserve_shared(bo->tbo.resv, 1);
	if (r)
		goto err;

+2 −2
Original line number Diff line number Diff line
@@ -772,7 +772,7 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,

	ring = container_of(vm->entity.rq->sched, struct amdgpu_ring, sched);

	r = reservation_object_reserve_shared(bo->tbo.resv);
	r = reservation_object_reserve_shared(bo->tbo.resv, 1);
	if (r)
		return r;

@@ -1839,7 +1839,7 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
	if (r)
		goto error_free;

	r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv);
	r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv, 1);
	if (r)
		goto error_free;

+1 −1
Original line number Diff line number Diff line
@@ -179,7 +179,7 @@ static int submit_fence_sync(struct etnaviv_gem_submit *submit)
		struct reservation_object *robj = bo->obj->resv;

		if (!(bo->flags & ETNA_SUBMIT_BO_WRITE)) {
			ret = reservation_object_reserve_shared(robj);
			ret = reservation_object_reserve_shared(robj, 1);
			if (ret)
				return ret;
		}
Loading