Commit 4fac4fcf authored by Lang Yu's avatar Lang Yu Committed by Alex Deucher

drm/amdkfd: add pinned BOs to kfd_bo_list

The kfd_bo_list is used to restore process BOs after
evictions. As page tables could be destroyed during
evictions, we should also update pinned BOs' page tables
during restoring to make sure they are valid.

So for pinned BOs,
1, Validate them and update their page tables.
2, Don't add eviction fence for them.

v2:
 - Don't handle pinned ones specially in BO validation.(Felix)
Signed-off-by: default avatarLang Yu <Lang.Yu@amd.com>
Acked-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 4d1e5f12
...@@ -1918,9 +1918,6 @@ int amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(struct amdgpu_device *adev, ...@@ -1918,9 +1918,6 @@ int amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(struct amdgpu_device *adev,
return -EINVAL; return -EINVAL;
} }
/* delete kgd_mem from kfd_bo_list to avoid re-validating
* this BO in BO's restoring after eviction.
*/
mutex_lock(&mem->process_info->lock); mutex_lock(&mem->process_info->lock);
ret = amdgpu_bo_reserve(bo, true); ret = amdgpu_bo_reserve(bo, true);
...@@ -1943,7 +1940,6 @@ int amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(struct amdgpu_device *adev, ...@@ -1943,7 +1940,6 @@ int amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(struct amdgpu_device *adev,
amdgpu_amdkfd_remove_eviction_fence( amdgpu_amdkfd_remove_eviction_fence(
bo, mem->process_info->eviction_fence); bo, mem->process_info->eviction_fence);
list_del_init(&mem->validate_list.head);
if (size) if (size)
*size = amdgpu_bo_size(bo); *size = amdgpu_bo_size(bo);
...@@ -2512,12 +2508,15 @@ int amdgpu_amdkfd_gpuvm_restore_process_bos(void *info, struct dma_fence **ef) ...@@ -2512,12 +2508,15 @@ int amdgpu_amdkfd_gpuvm_restore_process_bos(void *info, struct dma_fence **ef)
process_info->eviction_fence = new_fence; process_info->eviction_fence = new_fence;
*ef = dma_fence_get(&new_fence->base); *ef = dma_fence_get(&new_fence->base);
/* Attach new eviction fence to all BOs */ /* Attach new eviction fence to all BOs except pinned ones */
list_for_each_entry(mem, &process_info->kfd_bo_list, list_for_each_entry(mem, &process_info->kfd_bo_list,
validate_list.head) validate_list.head) {
if (mem->bo->tbo.pin_count)
continue;
amdgpu_bo_fence(mem->bo, amdgpu_bo_fence(mem->bo,
&process_info->eviction_fence->base, true); &process_info->eviction_fence->base, true);
}
/* Attach eviction fence to PD / PT BOs */ /* Attach eviction fence to PD / PT BOs */
list_for_each_entry(peer_vm, &process_info->vm_list_head, list_for_each_entry(peer_vm, &process_info->vm_list_head,
vm_list_node) { vm_list_node) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment