Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdkfd: amdkfd_free_gtt_mem clear the correct pointer

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>

authored by

Philip Yang and committed by
Alex Deucher
c86ad391 f9e292cb

+16 -16
+7 -7
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
··· 364 364 return r; 365 365 } 366 366 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) 368 368 { 369 - struct amdgpu_bo *bo = (struct amdgpu_bo *) mem_obj; 369 + struct amdgpu_bo **bo = (struct amdgpu_bo **) mem_obj; 370 370 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); 376 376 } 377 377 378 378 int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size,
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
··· 235 235 int amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size, 236 236 void **mem_obj, uint64_t *gpu_addr, 237 237 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); 239 239 int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size, 240 240 void **mem_obj); 241 241 void amdgpu_amdkfd_free_gws(struct amdgpu_device *adev, void *mem_obj);
+1 -1
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
··· 423 423 424 424 err_create_queue: 425 425 if (wptr_bo) 426 - amdgpu_amdkfd_free_gtt_mem(dev->adev, wptr_bo); 426 + amdgpu_amdkfd_free_gtt_mem(dev->adev, (void **)&wptr_bo); 427 427 err_wptr_map_gart: 428 428 err_bind_process: 429 429 err_pdd:
+2 -2
drivers/gpu/drm/amd/amdkfd/kfd_device.c
··· 907 907 kfd_doorbell_error: 908 908 kfd_gtt_sa_fini(kfd); 909 909 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); 911 911 alloc_gtt_mem_failure: 912 912 dev_err(kfd_device, 913 913 "device %x:%x NOT added due to errors\n", ··· 925 925 kfd_doorbell_fini(kfd); 926 926 ida_destroy(&kfd->doorbell_ida); 927 927 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); 929 929 } 930 930 931 931 kfree(kfd);
+1 -1
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
··· 2621 2621 { 2622 2622 WARN(!mqd, "No hiq sdma mqd trunk to free"); 2623 2623 2624 - amdgpu_amdkfd_free_gtt_mem(dev->adev, mqd->gtt_mem); 2624 + amdgpu_amdkfd_free_gtt_mem(dev->adev, &mqd->gtt_mem); 2625 2625 } 2626 2626 2627 2627 void device_queue_manager_uninit(struct device_queue_manager *dqm)
+1 -1
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
··· 225 225 struct kfd_mem_obj *mqd_mem_obj) 226 226 { 227 227 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); 229 229 kfree(mqd_mem_obj); 230 230 } else { 231 231 kfd_gtt_sa_free(mm->dev, mqd_mem_obj);
+1 -1
drivers/gpu/drm/amd/amdkfd/kfd_process.c
··· 1048 1048 1049 1049 if (pdd->dev->kfd->shared_resources.enable_mes) 1050 1050 amdgpu_amdkfd_free_gtt_mem(pdd->dev->adev, 1051 - pdd->proc_ctx_bo); 1051 + &pdd->proc_ctx_bo); 1052 1052 /* 1053 1053 * before destroying pdd, make sure to report availability 1054 1054 * for auto suspend
+2 -2
drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
··· 204 204 } 205 205 206 206 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); 208 208 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); 210 210 } 211 211 } 212 212