mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-27 11:58:32 -04:00
drm/amdgpu: fix race between pstate and remote buffer map
Vega20 arbitrates pstate at hive level and not device level. Last peer to remote buffer unmap could drop P-State while another process is still remote buffer mapped. With this fix, P-States still needs to be disabled for now as SMU bug was discovered on synchronous P2P transfers. This should be fixed in the next FW update. Signed-off-by: Jonathan Kim <Jonathan.Kim@amd.com> Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
9f65693577
commit
d84a430d9f
@@ -2124,11 +2124,8 @@ struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev,
|
||||
if (bo && amdgpu_xgmi_same_hive(adev, amdgpu_ttm_adev(bo->tbo.bdev)) &&
|
||||
(bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM)) {
|
||||
bo_va->is_xgmi = true;
|
||||
mutex_lock(&adev->vm_manager.lock_pstate);
|
||||
/* Power up XGMI if it can be potentially used */
|
||||
if (++adev->vm_manager.xgmi_map_counter == 1)
|
||||
amdgpu_xgmi_set_pstate(adev, 1);
|
||||
mutex_unlock(&adev->vm_manager.lock_pstate);
|
||||
amdgpu_xgmi_set_pstate(adev, AMDGPU_XGMI_PSTATE_MAX_VEGA20);
|
||||
}
|
||||
|
||||
return bo_va;
|
||||
@@ -2551,12 +2548,8 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
|
||||
|
||||
dma_fence_put(bo_va->last_pt_update);
|
||||
|
||||
if (bo && bo_va->is_xgmi) {
|
||||
mutex_lock(&adev->vm_manager.lock_pstate);
|
||||
if (--adev->vm_manager.xgmi_map_counter == 0)
|
||||
amdgpu_xgmi_set_pstate(adev, 0);
|
||||
mutex_unlock(&adev->vm_manager.lock_pstate);
|
||||
}
|
||||
if (bo && bo_va->is_xgmi)
|
||||
amdgpu_xgmi_set_pstate(adev, AMDGPU_XGMI_PSTATE_MIN);
|
||||
|
||||
kfree(bo_va);
|
||||
}
|
||||
@@ -3166,9 +3159,6 @@ void amdgpu_vm_manager_init(struct amdgpu_device *adev)
|
||||
|
||||
idr_init(&adev->vm_manager.pasid_idr);
|
||||
spin_lock_init(&adev->vm_manager.pasid_lock);
|
||||
|
||||
adev->vm_manager.xgmi_map_counter = 0;
|
||||
mutex_init(&adev->vm_manager.lock_pstate);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user