aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorNirmoy Das <nirmoy.das@amd.com>2020-01-21 13:29:20 +0100
committerAlex Deucher <alexander.deucher@amd.com>2020-01-22 16:55:27 -0500
commit63e3ab9a8226c0271e823f32fc1c3de67d142c78 (patch)
tree04dd59677ecb56e75a69f0214a99caed1e1d9657 /drivers/gpu/drm/amd/amdgpu
parentRevert "drm/amdgpu: fix modprobe failure of the secondary GPU when GDDR6 training enabled(V5)" (diff)
downloadlinux-dev-63e3ab9a8226c0271e823f32fc1c3de67d142c78.tar.xz
linux-dev-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')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c44
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h1
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;