[PATCH] drm/amdgpu: individualize fence allocation per entity

Christian König christian.koenig at amd.com
Tue Jan 21 13:18:41 UTC 2020


Am 21.01.20 um 14:05 schrieb Nirmoy Das:
> Allocate fences for each entity and remove ctx->fences reference as
> fences should be bound to amdgpu_ctx_entity instead amdgpu_ctx.
>
> Signed-off-by: Nirmoy Das <nirmoy.das at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 43 +++++++++++++++----------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h |  1 -
>   2 files changed, 26 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
> index 64e2babbc36e..a9b611fd6242 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
> @@ -87,24 +87,24 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev,
>   	memset(ctx, 0, sizeof(*ctx));
>   	ctx->adev = adev;
>   
> -	ctx->fences = kcalloc(amdgpu_sched_jobs * num_entities,
> -			      sizeof(struct dma_fence*), GFP_KERNEL);
> -	if (!ctx->fences)
> -		return -ENOMEM;
>   
>   	ctx->entities[0] = kcalloc(num_entities,
>   				   sizeof(struct amdgpu_ctx_entity),
>   				   GFP_KERNEL);
> -	if (!ctx->entities[0]) {
> -		r = -ENOMEM;
> -		goto error_free_fences;
> -	}
> +	if (!ctx->entities[0])
> +		return -ENOMEM;
> +
>   
>   	for (i = 0; i < num_entities; ++i) {
>   		struct amdgpu_ctx_entity *entity = &ctx->entities[0][i];
>   
>   		entity->sequence = 1;
> -		entity->fences = &ctx->fences[amdgpu_sched_jobs * i];
> +		entity->fences = kcalloc(amdgpu_sched_jobs,
> +					 sizeof(struct dma_fence*), GFP_KERNEL);
> +		if (!entity->fences) {
> +			r = -ENOMEM;
> +			goto error_cleanup_memory;
> +		}
>   	}
>   	for (i = 1; i < AMDGPU_HW_IP_NUM; ++i)
>   		ctx->entities[i] = ctx->entities[i - 1] +
> @@ -181,11 +181,16 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev,
>   error_cleanup_entities:
>   	for (i = 0; i < num_entities; ++i)
>   		drm_sched_entity_destroy(&ctx->entities[0][i].entity);
> -	kfree(ctx->entities[0]);
>   
> -error_free_fences:
> -	kfree(ctx->fences);
> -	ctx->fences = NULL;
> +error_cleanup_memory:
> +	for (i = 0; i < num_entities; ++i) {
> +		struct amdgpu_ctx_entity *entity = &ctx->entities[0][i];
> +		kfree(entity->fences);
> +		entity->fences = NULL;

Empty line between declaration and code please.

Apart from that the patch is Reviewed-by: Christian König 
<christian.koenig at amd.com>

> +	}
> +
> +	kfree(ctx->entities[0]);
> +	ctx->entities[0] = NULL;
>   	return r;
>   }
>   
> @@ -199,12 +204,16 @@ static void amdgpu_ctx_fini(struct kref *ref)
>   	if (!adev)
>   		return;
>   
> -	for (i = 0; i < num_entities; ++i)
> +	for (i = 0; i < num_entities; ++i) {
> +		struct amdgpu_ctx_entity *entity = &ctx->entities[0][i];
> +
>   		for (j = 0; j < amdgpu_sched_jobs; ++j)
> -			dma_fence_put(ctx->entities[0][i].fences[j]);
> -	kfree(ctx->fences);
> -	kfree(ctx->entities[0]);
> +			dma_fence_put(entity->fences[j]);
> +
> +		kfree(entity->fences);
> +	}
>   
> +	kfree(ctx->entities[0]);
>   	mutex_destroy(&ctx->lock);
>   
>   	kfree(ctx);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h
> index 4ad90a44dc3c..a6cd9d4b078c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h
> @@ -42,7 +42,6 @@ struct amdgpu_ctx {
>   	unsigned			reset_counter_query;
>   	uint32_t			vram_lost_counter;
>   	spinlock_t			ring_lock;
> -	struct dma_fence		**fences;
>   	struct amdgpu_ctx_entity	*entities[AMDGPU_HW_IP_NUM];
>   	bool				preamble_presented;
>   	enum drm_sched_priority		init_priority;



More information about the amd-gfx mailing list