Skip to content

Commit e783161

Browse files
PhilipYangAgregkh
authored andcommitted
drm/amdkfd: amdkfd_free_gtt_mem clear the correct pointer
commit c86ad39140bbcb9dc75a10046c2221f657e8083b upstream. 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 <[email protected]> Reviewed-by: Felix Kuehling <[email protected]> Acked-by: Christian König <[email protected]> Signed-off-by: Alex Deucher <[email protected]> Signed-off-by: Sasha Levin <[email protected]> Signed-off-by: Vamsi Krishna Brahmajosyula <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 0dc3ad9 commit e783161

File tree

8 files changed

+16
-16
lines changed

8 files changed

+16
-16
lines changed

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -344,15 +344,15 @@ int amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size,
344344
return r;
345345
}
346346

347-
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void *mem_obj)
347+
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj)
348348
{
349-
struct amdgpu_bo *bo = (struct amdgpu_bo *) mem_obj;
349+
struct amdgpu_bo **bo = (struct amdgpu_bo **) mem_obj;
350350

351-
amdgpu_bo_reserve(bo, true);
352-
amdgpu_bo_kunmap(bo);
353-
amdgpu_bo_unpin(bo);
354-
amdgpu_bo_unreserve(bo);
355-
amdgpu_bo_unref(&(bo));
351+
amdgpu_bo_reserve(*bo, true);
352+
amdgpu_bo_kunmap(*bo);
353+
amdgpu_bo_unpin(*bo);
354+
amdgpu_bo_unreserve(*bo);
355+
amdgpu_bo_unref(bo);
356356
}
357357

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

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ int amdgpu_amdkfd_evict_userptr(struct kgd_mem *mem, struct mm_struct *mm)
210210
int amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size,
211211
void **mem_obj, uint64_t *gpu_addr,
212212
void **cpu_ptr, bool mqd_gfx9);
213-
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void *mem_obj);
213+
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj);
214214
int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size,
215215
void **mem_obj);
216216
void amdgpu_amdkfd_free_gws(struct amdgpu_device *adev, void *mem_obj);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,
408408

409409
err_create_queue:
410410
if (wptr_bo)
411-
amdgpu_amdkfd_free_gtt_mem(dev->adev, wptr_bo);
411+
amdgpu_amdkfd_free_gtt_mem(dev->adev, (void **)&wptr_bo);
412412
err_wptr_map_gart:
413413
err_alloc_doorbells:
414414
err_bind_process:

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -673,7 +673,7 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
673673
kfd_doorbell_error:
674674
kfd_gtt_sa_fini(kfd);
675675
kfd_gtt_sa_init_error:
676-
amdgpu_amdkfd_free_gtt_mem(kfd->adev, kfd->gtt_mem);
676+
amdgpu_amdkfd_free_gtt_mem(kfd->adev, &kfd->gtt_mem);
677677
alloc_gtt_mem_failure:
678678
if (kfd->gws)
679679
amdgpu_amdkfd_free_gws(kfd->adev, kfd->gws);
@@ -693,7 +693,7 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)
693693
kfd_doorbell_fini(kfd);
694694
ida_destroy(&kfd->doorbell_ida);
695695
kfd_gtt_sa_fini(kfd);
696-
amdgpu_amdkfd_free_gtt_mem(kfd->adev, kfd->gtt_mem);
696+
amdgpu_amdkfd_free_gtt_mem(kfd->adev, &kfd->gtt_mem);
697697
if (kfd->gws)
698698
amdgpu_amdkfd_free_gws(kfd->adev, kfd->gws);
699699
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2392,7 +2392,7 @@ static void deallocate_hiq_sdma_mqd(struct kfd_dev *dev,
23922392
{
23932393
WARN(!mqd, "No hiq sdma mqd trunk to free");
23942394

2395-
amdgpu_amdkfd_free_gtt_mem(dev->adev, mqd->gtt_mem);
2395+
amdgpu_amdkfd_free_gtt_mem(dev->adev, &mqd->gtt_mem);
23962396
}
23972397

23982398
void device_queue_manager_uninit(struct device_queue_manager *dqm)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ void kfd_free_mqd_cp(struct mqd_manager *mm, void *mqd,
204204
struct kfd_mem_obj *mqd_mem_obj)
205205
{
206206
if (mqd_mem_obj->gtt_mem) {
207-
amdgpu_amdkfd_free_gtt_mem(mm->dev->adev, mqd_mem_obj->gtt_mem);
207+
amdgpu_amdkfd_free_gtt_mem(mm->dev->adev, &mqd_mem_obj->gtt_mem);
208208
kfree(mqd_mem_obj);
209209
} else {
210210
kfd_gtt_sa_free(mm->dev, mqd_mem_obj);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1052,7 +1052,7 @@ static void kfd_process_destroy_pdds(struct kfd_process *p)
10521052

10531053
if (pdd->dev->shared_resources.enable_mes)
10541054
amdgpu_amdkfd_free_gtt_mem(pdd->dev->adev,
1055-
pdd->proc_ctx_bo);
1055+
&pdd->proc_ctx_bo);
10561056
/*
10571057
* before destroying pdd, make sure to report availability
10581058
* for auto suspend

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,9 +441,9 @@ int pqm_destroy_queue(struct process_queue_manager *pqm, unsigned int qid)
441441

442442
if (dev->shared_resources.enable_mes) {
443443
amdgpu_amdkfd_free_gtt_mem(dev->adev,
444-
pqn->q->gang_ctx_bo);
444+
&pqn->q->gang_ctx_bo);
445445
if (pqn->q->wptr_bo)
446-
amdgpu_amdkfd_free_gtt_mem(dev->adev, pqn->q->wptr_bo);
446+
amdgpu_amdkfd_free_gtt_mem(dev->adev, (void **)&pqn->q->wptr_bo);
447447

448448
}
449449
uninit_queue(pqn->q);

0 commit comments

Comments
 (0)