Skip to content
This repository was archived by the owner on Oct 31, 2024. It is now read-only.

Commit 6c92898

Browse files
PhilipYangAgregkh
authored andcommitted
drm/amdkfd: amdkfd_free_gtt_mem clear the correct pointer
[ Upstream commit c86ad39 ] Pass pointer reference to amdgpu_bo_unref to clear the correct pointer, otherwise amdgpu_bo_unref clear the local variable, the original pointer not set to NULL, this could cause use-after-free bug. Signed-off-by: Philip Yang <Philip.Yang@amd.com> Reviewed-by: Felix Kuehling <felix.kuehling@amd.com> Acked-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 5382ec1 commit 6c92898

8 files changed

+16
-16
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c

+7-7
Original file line numberDiff line numberDiff line change
@@ -364,15 +364,15 @@ int amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size,
364364
return r;
365365
}
366366

367-
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void *mem_obj)
367+
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj)
368368
{
369-
struct amdgpu_bo *bo = (struct amdgpu_bo *) mem_obj;
369+
struct amdgpu_bo **bo = (struct amdgpu_bo **) mem_obj;
370370

371-
amdgpu_bo_reserve(bo, true);
372-
amdgpu_bo_kunmap(bo);
373-
amdgpu_bo_unpin(bo);
374-
amdgpu_bo_unreserve(bo);
375-
amdgpu_bo_unref(&(bo));
371+
amdgpu_bo_reserve(*bo, true);
372+
amdgpu_bo_kunmap(*bo);
373+
amdgpu_bo_unpin(*bo);
374+
amdgpu_bo_unreserve(*bo);
375+
amdgpu_bo_unref(bo);
376376
}
377377

378378
int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size,

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ int amdgpu_amdkfd_bo_validate_and_fence(struct amdgpu_bo *bo,
235235
int amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size,
236236
void **mem_obj, uint64_t *gpu_addr,
237237
void **cpu_ptr, bool mqd_gfx9);
238-
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void *mem_obj);
238+
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj);
239239
int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size,
240240
void **mem_obj);
241241
void amdgpu_amdkfd_free_gws(struct amdgpu_device *adev, void *mem_obj);

drivers/gpu/drm/amd/amdkfd/kfd_chardev.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,
423423

424424
err_create_queue:
425425
if (wptr_bo)
426-
amdgpu_amdkfd_free_gtt_mem(dev->adev, wptr_bo);
426+
amdgpu_amdkfd_free_gtt_mem(dev->adev, (void **)&wptr_bo);
427427
err_wptr_map_gart:
428428
err_bind_process:
429429
err_pdd:

drivers/gpu/drm/amd/amdkfd/kfd_device.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -907,7 +907,7 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
907907
kfd_doorbell_error:
908908
kfd_gtt_sa_fini(kfd);
909909
kfd_gtt_sa_init_error:
910-
amdgpu_amdkfd_free_gtt_mem(kfd->adev, kfd->gtt_mem);
910+
amdgpu_amdkfd_free_gtt_mem(kfd->adev, &kfd->gtt_mem);
911911
alloc_gtt_mem_failure:
912912
dev_err(kfd_device,
913913
"device %x:%x NOT added due to errors\n",
@@ -925,7 +925,7 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)
925925
kfd_doorbell_fini(kfd);
926926
ida_destroy(&kfd->doorbell_ida);
927927
kfd_gtt_sa_fini(kfd);
928-
amdgpu_amdkfd_free_gtt_mem(kfd->adev, kfd->gtt_mem);
928+
amdgpu_amdkfd_free_gtt_mem(kfd->adev, &kfd->gtt_mem);
929929
}
930930

931931
kfree(kfd);

drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2621,7 +2621,7 @@ static void deallocate_hiq_sdma_mqd(struct kfd_node *dev,
26212621
{
26222622
WARN(!mqd, "No hiq sdma mqd trunk to free");
26232623

2624-
amdgpu_amdkfd_free_gtt_mem(dev->adev, mqd->gtt_mem);
2624+
amdgpu_amdkfd_free_gtt_mem(dev->adev, &mqd->gtt_mem);
26252625
}
26262626

26272627
void device_queue_manager_uninit(struct device_queue_manager *dqm)

drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ void kfd_free_mqd_cp(struct mqd_manager *mm, void *mqd,
225225
struct kfd_mem_obj *mqd_mem_obj)
226226
{
227227
if (mqd_mem_obj->gtt_mem) {
228-
amdgpu_amdkfd_free_gtt_mem(mm->dev->adev, mqd_mem_obj->gtt_mem);
228+
amdgpu_amdkfd_free_gtt_mem(mm->dev->adev, &mqd_mem_obj->gtt_mem);
229229
kfree(mqd_mem_obj);
230230
} else {
231231
kfd_gtt_sa_free(mm->dev, mqd_mem_obj);

drivers/gpu/drm/amd/amdkfd/kfd_process.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,7 @@ static void kfd_process_destroy_pdds(struct kfd_process *p)
10481048

10491049
if (pdd->dev->kfd->shared_resources.enable_mes)
10501050
amdgpu_amdkfd_free_gtt_mem(pdd->dev->adev,
1051-
pdd->proc_ctx_bo);
1051+
&pdd->proc_ctx_bo);
10521052
/*
10531053
* before destroying pdd, make sure to report availability
10541054
* for auto suspend

drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,9 @@ static void pqm_clean_queue_resource(struct process_queue_manager *pqm,
204204
}
205205

206206
if (dev->kfd->shared_resources.enable_mes) {
207-
amdgpu_amdkfd_free_gtt_mem(dev->adev, pqn->q->gang_ctx_bo);
207+
amdgpu_amdkfd_free_gtt_mem(dev->adev, &pqn->q->gang_ctx_bo);
208208
if (pqn->q->wptr_bo)
209-
amdgpu_amdkfd_free_gtt_mem(dev->adev, pqn->q->wptr_bo);
209+
amdgpu_amdkfd_free_gtt_mem(dev->adev, (void **)&pqn->q->wptr_bo);
210210
}
211211
}
212212

0 commit comments

Comments
 (0)