diff options
author | Nirmoy Das <nirmoy.das@amd.com> | 2020-01-21 13:29:20 +0100 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2020-01-22 22:55:27 +0100 |
commit | 63e3ab9a8226c0271e823f32fc1c3de67d142c78 (patch) | |
tree | 04dd59677ecb56e75a69f0214a99caed1e1d9657 /drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | |
parent | Revert "drm/amdgpu: fix modprobe failure of the secondary GPU when GDDR6 trai... (diff) | |
download | linux-63e3ab9a8226c0271e823f32fc1c3de67d142c78.tar.xz linux-63e3ab9a8226c0271e823f32fc1c3de67d142c78.zip |
drm/amdgpu: individualize fence allocation per entity
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@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c index 64e2babbc36e..05c2af61e7de 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,17 @@ 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; + } + + kfree(ctx->entities[0]); + ctx->entities[0] = NULL; return r; } @@ -199,12 +205,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); |