drm/amdkfd: handle fault counters on invalid address

prange is NULL if vm fault retry on invalid address, for this case, can
not use prange to get pdd, use adev to get gpuidx and then get pdd
instead, then increase pdd vm fault counter.

Signed-off-by: Philip Yang <Philip.Yang@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Philip Yang 2021-07-07 12:42:34 -04:00 committed by Alex Deucher
parent 9604b74bff
commit 4818545a1d

View File

@ -2375,21 +2375,27 @@ static bool svm_range_skip_recover(struct svm_range *prange)
static void static void
svm_range_count_fault(struct amdgpu_device *adev, struct kfd_process *p, svm_range_count_fault(struct amdgpu_device *adev, struct kfd_process *p,
struct svm_range *prange, int32_t gpuidx) int32_t gpuidx)
{ {
struct kfd_process_device *pdd; struct kfd_process_device *pdd;
if (gpuidx == MAX_GPU_INSTANCE) /* fault is on different page of same range
/* fault is on different page of same range * or fault is skipped to recover later
* or fault is skipped to recover later * or fault is on invalid virtual address
*/ */
pdd = svm_range_get_pdd_by_adev(prange, adev); if (gpuidx == MAX_GPU_INSTANCE) {
else uint32_t gpuid;
/* fault recovered int r;
* or fault cannot recover because GPU no access on the range
*/
pdd = kfd_process_device_from_gpuidx(p, gpuidx);
r = kfd_process_gpuid_from_kgd(p, adev, &gpuid, &gpuidx);
if (r < 0)
return;
}
/* fault is recovered
* or fault cannot recover because GPU no access on the range
*/
pdd = kfd_process_device_from_gpuidx(p, gpuidx);
if (pdd) if (pdd)
WRITE_ONCE(pdd->faults, pdd->faults + 1); WRITE_ONCE(pdd->faults, pdd->faults + 1);
} }
@ -2525,7 +2531,7 @@ out_unlock_svms:
mutex_unlock(&svms->lock); mutex_unlock(&svms->lock);
mmap_read_unlock(mm); mmap_read_unlock(mm);
svm_range_count_fault(adev, p, prange, gpuidx); svm_range_count_fault(adev, p, gpuidx);
mmput(mm); mmput(mm);
out: out: