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

Commit 30ceb87

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 44e4aea commit 30ceb87

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
@@ -335,15 +335,15 @@ int amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size,
335335
return r;
336336
}
337337

338-
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void *mem_obj)
338+
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj)
339339
{
340-
struct amdgpu_bo *bo = (struct amdgpu_bo *) mem_obj;
340+
struct amdgpu_bo **bo = (struct amdgpu_bo **) mem_obj;
341341

342-
amdgpu_bo_reserve(bo, true);
343-
amdgpu_bo_kunmap(bo);
344-
amdgpu_bo_unpin(bo);
345-
amdgpu_bo_unreserve(bo);
346-
amdgpu_bo_unref(&(bo));
342+
amdgpu_bo_reserve(*bo, true);
343+
amdgpu_bo_kunmap(*bo);
344+
amdgpu_bo_unpin(*bo);
345+
amdgpu_bo_unreserve(*bo);
346+
amdgpu_bo_unref(bo);
347347
}
348348

349349
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
@@ -221,7 +221,7 @@ int amdgpu_amdkfd_evict_userptr(struct mmu_interval_notifier *mni,
221221
int amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size,
222222
void **mem_obj, uint64_t *gpu_addr,
223223
void **cpu_ptr, bool mqd_gfx9);
224-
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void *mem_obj);
224+
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj);
225225
int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size,
226226
void **mem_obj);
227227
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
@@ -417,7 +417,7 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,
417417

418418
err_create_queue:
419419
if (wptr_bo)
420-
amdgpu_amdkfd_free_gtt_mem(dev->adev, wptr_bo);
420+
amdgpu_amdkfd_free_gtt_mem(dev->adev, (void **)&wptr_bo);
421421
err_wptr_map_gart:
422422
err_bind_process:
423423
err_pdd:

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -838,7 +838,7 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
838838
kfd_doorbell_error:
839839
kfd_gtt_sa_fini(kfd);
840840
kfd_gtt_sa_init_error:
841-
amdgpu_amdkfd_free_gtt_mem(kfd->adev, kfd->gtt_mem);
841+
amdgpu_amdkfd_free_gtt_mem(kfd->adev, &kfd->gtt_mem);
842842
alloc_gtt_mem_failure:
843843
dev_err(kfd_device,
844844
"device %x:%x NOT added due to errors\n",
@@ -856,7 +856,7 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)
856856
kfd_doorbell_fini(kfd);
857857
ida_destroy(&kfd->doorbell_ida);
858858
kfd_gtt_sa_fini(kfd);
859-
amdgpu_amdkfd_free_gtt_mem(kfd->adev, kfd->gtt_mem);
859+
amdgpu_amdkfd_free_gtt_mem(kfd->adev, &kfd->gtt_mem);
860860
}
861861

862862
kfree(kfd);

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

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

2613-
amdgpu_amdkfd_free_gtt_mem(dev->adev, mqd->gtt_mem);
2613+
amdgpu_amdkfd_free_gtt_mem(dev->adev, &mqd->gtt_mem);
26142614
}
26152615

26162616
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
@@ -223,7 +223,7 @@ void kfd_free_mqd_cp(struct mqd_manager *mm, void *mqd,
223223
struct kfd_mem_obj *mqd_mem_obj)
224224
{
225225
if (mqd_mem_obj->gtt_mem) {
226-
amdgpu_amdkfd_free_gtt_mem(mm->dev->adev, mqd_mem_obj->gtt_mem);
226+
amdgpu_amdkfd_free_gtt_mem(mm->dev->adev, &mqd_mem_obj->gtt_mem);
227227
kfree(mqd_mem_obj);
228228
} else {
229229
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
@@ -1047,7 +1047,7 @@ static void kfd_process_destroy_pdds(struct kfd_process *p)
10471047

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

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,9 @@ static void pqm_clean_queue_resource(struct process_queue_manager *pqm,
199199
}
200200

201201
if (dev->kfd->shared_resources.enable_mes) {
202-
amdgpu_amdkfd_free_gtt_mem(dev->adev, pqn->q->gang_ctx_bo);
202+
amdgpu_amdkfd_free_gtt_mem(dev->adev, &pqn->q->gang_ctx_bo);
203203
if (pqn->q->wptr_bo)
204-
amdgpu_amdkfd_free_gtt_mem(dev->adev, pqn->q->wptr_bo);
204+
amdgpu_amdkfd_free_gtt_mem(dev->adev, (void **)&pqn->q->wptr_bo);
205205
}
206206
}
207207

0 commit comments

Comments
 (0)