process_info
void **process_info,
int amdgpu_amdkfd_gpuvm_restore_process_bos(void *process_info,
struct amdkfd_process_info *process_info;
struct amdkfd_process_info *process_info,
mutex_lock(&process_info->lock);
&process_info->userptr_valid_list);
list_add_tail(&mem->validate_list, &process_info->kfd_bo_list);
mutex_unlock(&process_info->lock);
struct amdkfd_process_info *process_info)
mutex_lock(&process_info->lock);
mutex_unlock(&process_info->lock);
struct amdkfd_process_info *process_info = mem->process_info;
mutex_lock(&process_info->lock);
mutex_lock(&process_info->notifier_lock);
mutex_unlock(&process_info->notifier_lock);
mutex_unlock(&process_info->lock);
mutex_unlock(&process_info->lock);
static int process_validate_vms(struct amdkfd_process_info *process_info,
list_for_each_entry(peer_vm, &process_info->vm_list_head,
static int process_sync_pds_resv(struct amdkfd_process_info *process_info,
list_for_each_entry(peer_vm, &process_info->vm_list_head,
static int process_update_pds(struct amdkfd_process_info *process_info,
list_for_each_entry(peer_vm, &process_info->vm_list_head,
static int init_kfd_vm(struct amdgpu_vm *vm, void **process_info,
process = container_of(process_info, struct kfd_process, kgd_process_info);
if (!*process_info) {
*process_info = info;
if (cmpxchg(&vm->process_info, NULL, *process_info) != NULL) {
&vm->process_info->eviction_fence->base,
mutex_lock(&vm->process_info->lock);
&(vm->process_info->vm_list_head));
vm->process_info->n_vms++;
*ef = dma_fence_get(&vm->process_info->eviction_fence->base);
mutex_unlock(&vm->process_info->lock);
vm->process_info = NULL;
*process_info = NULL;
void **process_info,
if (avm->process_info)
ret = init_kfd_vm(avm, process_info, ef);
struct amdkfd_process_info *process_info = vm->process_info;
if (!process_info)
mutex_lock(&process_info->lock);
process_info->n_vms--;
mutex_unlock(&process_info->lock);
vm->process_info = NULL;
if (!process_info->n_vms) {
WARN_ON(!list_empty(&process_info->kfd_bo_list));
WARN_ON(!list_empty(&process_info->userptr_valid_list));
WARN_ON(!list_empty(&process_info->userptr_inval_list));
dma_fence_put(&process_info->eviction_fence->base);
cancel_delayed_work_sync(&process_info->restore_userptr_work);
put_pid(process_info->pid);
mutex_destroy(&process_info->lock);
mutex_destroy(&process_info->notifier_lock);
kfree(process_info);
(*mem)->process_info = avm->process_info;
add_kgd_mem_to_kfd_bo_list(*mem, avm->process_info, user_addr);
mutex_lock(&avm->process_info->lock);
if (avm->process_info->eviction_fence &&
!dma_fence_is_signaled(&avm->process_info->eviction_fence->base))
&avm->process_info->eviction_fence->base);
mutex_unlock(&avm->process_info->lock);
remove_kgd_mem_from_kfd_bo_list(*mem, avm->process_info);
struct amdkfd_process_info *process_info = mem->process_info;
mutex_lock(&process_info->lock);
mutex_unlock(&process_info->lock);
process_info->eviction_fence);
mutex_lock(&mem->process_info->lock);
mutex_lock(&mem->process_info->notifier_lock);
mutex_unlock(&mem->process_info->notifier_lock);
mutex_unlock(&mem->process_info->lock);
bo, bo->vm_bo->vm->process_info->eviction_fence);
mutex_lock(&mem->process_info->lock);
bo, mem->process_info->eviction_fence);
mutex_unlock(&mem->process_info->lock);
mutex_unlock(&mem->process_info->lock);
(*mem)->process_info = avm->process_info;
add_kgd_mem_to_kfd_bo_list(*mem, avm->process_info, false);
mutex_lock(&avm->process_info->lock);
if (avm->process_info->eviction_fence &&
!dma_fence_is_signaled(&avm->process_info->eviction_fence->base))
&avm->process_info->eviction_fence->base);
mutex_unlock(&avm->process_info->lock);
remove_kgd_mem_from_kfd_bo_list(*mem, avm->process_info);
struct amdkfd_process_info *process_info = mem->process_info;
if (READ_ONCE(process_info->block_mmu_notifications))
mutex_lock(&process_info->notifier_lock);
if (++process_info->evicted_bos == 1) {
&process_info->restore_userptr_work,
mutex_unlock(&process_info->notifier_lock);
static int update_invalid_user_pages(struct amdkfd_process_info *process_info,
mutex_lock(&process_info->notifier_lock);
&process_info->userptr_valid_list,
&process_info->userptr_inval_list);
list_for_each_entry(mem, &process_info->userptr_inval_list,
mutex_unlock(&process_info->notifier_lock);
pid_nr(process_info->pid), mem->va);
p = kfd_lookup_process_by_pid(process_info->pid);
mutex_lock(&process_info->notifier_lock);
mutex_unlock(&process_info->notifier_lock);
static int validate_invalid_user_pages(struct amdkfd_process_info *process_info)
list_for_each_entry(peer_vm, &process_info->vm_list_head,
list_for_each_entry(mem, &process_info->userptr_inval_list,
ret = process_validate_vms(process_info, NULL);
&process_info->userptr_inval_list,
mutex_lock(&process_info->notifier_lock);
mutex_unlock(&process_info->notifier_lock);
ret = process_update_pds(process_info, &sync);
static int confirm_valid_user_pages_locked(struct amdkfd_process_info *process_info)
&process_info->userptr_inval_list,
&process_info->userptr_valid_list);
struct amdkfd_process_info *process_info =
mutex_lock(&process_info->notifier_lock);
evicted_bos = process_info->evicted_bos;
mutex_unlock(&process_info->notifier_lock);
usertask = get_pid_task(process_info->pid, PIDTYPE_PID);
mutex_lock(&process_info->lock);
if (update_invalid_user_pages(process_info, mm))
if (!list_empty(&process_info->userptr_inval_list)) {
if (validate_invalid_user_pages(process_info))
mutex_lock(&process_info->notifier_lock);
if (process_info->evicted_bos != evicted_bos)
if (confirm_valid_user_pages_locked(process_info)) {
process_info->evicted_bos = evicted_bos = 0;
mutex_unlock(&process_info->notifier_lock);
mutex_unlock(&process_info->lock);
&process_info->restore_userptr_work,
struct amdkfd_process_info *process_info = info;
mutex_lock(&process_info->lock);
list_for_each_entry(peer_vm, &process_info->vm_list_head,
list_for_each_entry(mem, &process_info->kfd_bo_list,
list_for_each_entry(mem, &process_info->kfd_bo_list,
ret = process_validate_vms(process_info, drm_exec_ticket(&exec));
list_for_each_entry(mem, &process_info->kfd_bo_list,
list_for_each_entry(peer_vm, &process_info->vm_list_head,
pid_nr(process_info->pid));
pid_nr(process_info->pid));
ret = process_update_pds(process_info, &sync_obj);
ret = process_sync_pds_resv(process_info, &sync_obj);
if (dma_fence_is_signaled(&process_info->eviction_fence->base)) {
process_info->eviction_fence->base.context,
process_info->eviction_fence->mm,
NULL, process_info->context_id);
dma_fence_put(&process_info->eviction_fence->base);
process_info->eviction_fence = new_fence;
WARN_ONCE(*ef != &process_info->eviction_fence->base,
list_for_each_entry(mem, &process_info->kfd_bo_list, validate_list) {
&process_info->eviction_fence->base,
list_for_each_entry(peer_vm, &process_info->vm_list_head,
&process_info->eviction_fence->base,
mutex_unlock(&process_info->lock);
struct amdkfd_process_info *process_info = (struct amdkfd_process_info *)info;
(*mem)->process_info = process_info;
add_kgd_mem_to_kfd_bo_list(*mem, process_info, false);
mutex_lock(&(*mem)->process_info->lock);
&process_info->eviction_fence->base,
mutex_unlock(&(*mem)->process_info->lock);
mutex_unlock(&(*mem)->process_info->lock);
remove_kgd_mem_from_kfd_bo_list(*mem, process_info);
struct amdkfd_process_info *process_info = (struct amdkfd_process_info *)info;
remove_kgd_mem_from_kfd_bo_list(kgd_mem, process_info);
process_info->eviction_fence);
if (!vm->is_compute_context || !vm->process_info)
mutex_lock_nested(&vm->process_info->lock, 1);
if (!WARN_ON(!vm->process_info->eviction_fence)) {
&vm->process_info->eviction_fence->base);
mutex_unlock(&vm->process_info->lock);
struct amdkfd_process_info *process_info;
struct amdkfd_process_info *process_info;
process_info = p->kgd_process_info;
mutex_lock(&process_info->lock);
mutex_unlock(&process_info->lock);
struct amdkfd_process_info *process_info = p->kgd_process_info;
if (!process_info)
mutex_lock(&process_info->lock);
mutex_unlock(&process_info->lock);
process_info(dm, (struct dm_info_msg *)dm_msg);