diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 44 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h | 1 |
2 files changed, 27 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..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); 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; |