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

dma-buf/drivers: make reserving a shared slot mandatory v4



Audit all the users of dma_resv_add_excl_fence() and make sure they
reserve a shared slot also when only trying to add an exclusive fence.

This is the next step towards handling the exclusive fence like a
shared one.

v2: fix missed case in amdgpu
v3: and two more radeon, rename function
v4: add one more case to TTM, fix i915 after rebase

Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20220406075132.3263-2-christian.koenig@amd.com
parent 20b734c1
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -152,7 +152,7 @@ static inline struct dma_resv_list *dma_resv_shared_list(struct dma_resv *obj)
}

/**
 * dma_resv_reserve_shared - Reserve space to add shared fences to
 * dma_resv_reserve_fences - Reserve space to add shared fences to
 * a dma_resv.
 * @obj: reservation object
 * @num_fences: number of fences we want to add
@@ -167,7 +167,7 @@ static inline struct dma_resv_list *dma_resv_shared_list(struct dma_resv *obj)
 * RETURNS
 * Zero for success, or -errno
 */
int dma_resv_reserve_shared(struct dma_resv *obj, unsigned int num_fences)
int dma_resv_reserve_fences(struct dma_resv *obj, unsigned int num_fences)
{
	struct dma_resv_list *old, *new;
	unsigned int i, j, k, max;
@@ -230,7 +230,7 @@ int dma_resv_reserve_shared(struct dma_resv *obj, unsigned int num_fences)

	return 0;
}
EXPORT_SYMBOL(dma_resv_reserve_shared);
EXPORT_SYMBOL(dma_resv_reserve_fences);

#ifdef CONFIG_DEBUG_MUTEXES
/**
@@ -238,7 +238,7 @@ EXPORT_SYMBOL(dma_resv_reserve_shared);
 * @obj: the dma_resv object to reset
 *
 * Reset the number of pre-reserved shared slots to test that drivers do
 * correct slot allocation using dma_resv_reserve_shared(). See also
 * correct slot allocation using dma_resv_reserve_fences(). See also
 * &dma_resv_list.shared_max.
 */
void dma_resv_reset_shared_max(struct dma_resv *obj)
@@ -260,7 +260,7 @@ EXPORT_SYMBOL(dma_resv_reset_shared_max);
 * @fence: the shared fence to add
 *
 * Add a fence to a shared slot, @obj must be locked with dma_resv_lock(), and
 * dma_resv_reserve_shared() has been called.
 * dma_resv_reserve_fences() has been called.
 *
 * See also &dma_resv.fence for a discussion of the semantics.
 */
+30 −34
Original line number Diff line number Diff line
@@ -75,17 +75,16 @@ static int test_signaling(void *arg, bool shared)
		goto err_free;
	}

	if (shared) {
		r = dma_resv_reserve_shared(&resv, 1);
	r = dma_resv_reserve_fences(&resv, 1);
	if (r) {
		pr_err("Resv shared slot allocation failed\n");
		goto err_unlock;
	}

	if (shared)
		dma_resv_add_shared_fence(&resv, f);
	} else {
	else
		dma_resv_add_excl_fence(&resv, f);
	}

	if (dma_resv_test_signaled(&resv, shared)) {
		pr_err("Resv unexpectedly signaled\n");
@@ -134,17 +133,16 @@ static int test_for_each(void *arg, bool shared)
		goto err_free;
	}

	if (shared) {
		r = dma_resv_reserve_shared(&resv, 1);
	r = dma_resv_reserve_fences(&resv, 1);
	if (r) {
		pr_err("Resv shared slot allocation failed\n");
		goto err_unlock;
	}

	if (shared)
		dma_resv_add_shared_fence(&resv, f);
	} else {
	else
		dma_resv_add_excl_fence(&resv, f);
	}

	r = -ENOENT;
	dma_resv_for_each_fence(&cursor, &resv, shared, fence) {
@@ -206,18 +204,17 @@ static int test_for_each_unlocked(void *arg, bool shared)
		goto err_free;
	}

	if (shared) {
		r = dma_resv_reserve_shared(&resv, 1);
	r = dma_resv_reserve_fences(&resv, 1);
	if (r) {
		pr_err("Resv shared slot allocation failed\n");
		dma_resv_unlock(&resv);
		goto err_free;
	}

	if (shared)
		dma_resv_add_shared_fence(&resv, f);
	} else {
	else
		dma_resv_add_excl_fence(&resv, f);
	}
	dma_resv_unlock(&resv);

	r = -ENOENT;
@@ -290,18 +287,17 @@ static int test_get_fences(void *arg, bool shared)
		goto err_resv;
	}

	if (shared) {
		r = dma_resv_reserve_shared(&resv, 1);
	r = dma_resv_reserve_fences(&resv, 1);
	if (r) {
		pr_err("Resv shared slot allocation failed\n");
		dma_resv_unlock(&resv);
		goto err_resv;
	}

	if (shared)
		dma_resv_add_shared_fence(&resv, f);
	} else {
	else
		dma_resv_add_excl_fence(&resv, f);
	}
	dma_resv_unlock(&resv);

	r = dma_resv_get_fences(&resv, shared, &i, &fences);
+2 −2
Original line number Diff line number Diff line
@@ -1233,7 +1233,7 @@ static int init_kfd_vm(struct amdgpu_vm *vm, void **process_info,
				  AMDGPU_FENCE_OWNER_KFD, false);
	if (ret)
		goto wait_pd_fail;
	ret = dma_resv_reserve_shared(vm->root.bo->tbo.base.resv, 1);
	ret = dma_resv_reserve_fences(vm->root.bo->tbo.base.resv, 1);
	if (ret)
		goto reserve_shared_fail;
	amdgpu_bo_fence(vm->root.bo,
@@ -2571,7 +2571,7 @@ int amdgpu_amdkfd_add_gws_to_process(void *info, void *gws, struct kgd_mem **mem
	 * Add process eviction fence to bo so they can
	 * evict each other.
	 */
	ret = dma_resv_reserve_shared(gws_bo->tbo.base.resv, 1);
	ret = dma_resv_reserve_fences(gws_bo->tbo.base.resv, 1);
	if (ret)
		goto reserve_shared_fail;
	amdgpu_bo_fence(gws_bo, &process_info->eviction_fence->base, true);
+8 −0
Original line number Diff line number Diff line
@@ -1388,6 +1388,14 @@ void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence,
		     bool shared)
{
	struct dma_resv *resv = bo->tbo.base.resv;
	int r;

	r = dma_resv_reserve_fences(resv, 1);
	if (r) {
		/* As last resort on OOM we block for the fence */
		dma_fence_wait(fence, false);
		return;
	}

	if (shared)
		dma_resv_add_shared_fence(resv, fence);
+2 −2
Original line number Diff line number Diff line
@@ -2926,7 +2926,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)
	if (r)
		goto error_free_root;

	r = dma_resv_reserve_shared(root_bo->tbo.base.resv, 1);
	r = dma_resv_reserve_fences(root_bo->tbo.base.resv, 1);
	if (r)
		goto error_unreserve;

@@ -3369,7 +3369,7 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid,
		value = 0;
	}

	r = dma_resv_reserve_shared(root->tbo.base.resv, 1);
	r = dma_resv_reserve_fences(root->tbo.base.resv, 1);
	if (r) {
		pr_debug("failed %d to reserve fence slot\n", r);
		goto error_unlock;
Loading