From: Xiaogang Chen <xiaogang.chen@xxxxxxx> When register a vm range at svm the added vm range may be split into multiple subranges and/or existing pranges got spitted. The new pranges need validated and mapped. This patch changes error handling for pranges that fail updating: 1: free prange resources and remove it from svms if its updating fails as it will not be used. 2: return -EAGAIN when all pranges at update_list need redo valid/map, otherwise return no -EAGAIN error to user space to indicate failure. That removes unnecessary retries. Signed-off-by: Xiaogang Chen <xiaogang.chen@xxxxxxx> --- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c index e32e19196f6b..455cb98bf16a 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c @@ -3716,8 +3716,19 @@ svm_range_set_attr(struct kfd_process *p, struct mm_struct *mm, out_unlock_range: mutex_unlock(&prange->migrate_mutex); - if (r) - ret = r; + /* this prange cannot be migraed, valid or map */ + if (r) { + /* free this prange resources, remove it from svms */ + svm_range_unlink(prange); + svm_range_remove_notifier(prange); + svm_range_free(prange, false); + + /* ret got update when any r != -EAGAIN; + * return -EAGAIN when all pranges at update_list + * need redo valid/map */ + if (r != -EAGAIN || !ret) + ret = r; + } } list_for_each_entry(prange, &remap_list, update_list) { @@ -3729,8 +3740,16 @@ svm_range_set_attr(struct kfd_process *p, struct mm_struct *mm, if (r) pr_debug("failed %d on remap svm range\n", r); mutex_unlock(&prange->migrate_mutex); - if (r) - ret = r; + + if (r) { + /* remove this prange */ + svm_range_unlink(prange); + svm_range_remove_notifier(prange); + svm_range_free(prange, false); + + if (r != -EAGAIN || !ret) + ret = r; + } } dynamic_svm_range_dump(svms); -- 2.25.1