Commit 3af470cb authored by Xiaogang Chen's avatar Xiaogang Chen Committed by Alex Deucher
Browse files

drm/amdkfd: Fix an issue at userptr buffer validation process.



amdgpu_ttm_tt_get_user_pages can fail(-EFAULT). If it failed mem has no associated
hmm range or user_pages associated. Keep it at process_info->userptr_inval_list and
mark mem->invalid until following scheduled attempts can valid it.

Signed-off-by: default avatarXiaogang Chen <Xiaogang.Chen@amd.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 9fa8cc0c
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -2445,6 +2445,8 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,
			ret = -EAGAIN;
			goto unlock_out;
		}
		 /* set mem valid if mem has hmm range associated */
		if (mem->range)
			mem->invalid = 0;
	}

@@ -2577,7 +2579,14 @@ static int confirm_valid_user_pages_locked(struct amdkfd_process_info *process_i
	list_for_each_entry_safe(mem, tmp_mem,
				 &process_info->userptr_inval_list,
				 validate_list.head) {
		bool valid = amdgpu_ttm_tt_get_user_pages_done(
		bool valid;

		/* keep mem without hmm range at userptr_inval_list */
		if (!mem->range)
			 continue;

		/* Only check mem with hmm range associated */
		valid = amdgpu_ttm_tt_get_user_pages_done(
					mem->bo->tbo.ttm, mem->range);

		mem->range = NULL;
@@ -2586,7 +2595,12 @@ static int confirm_valid_user_pages_locked(struct amdkfd_process_info *process_i
			ret = -EAGAIN;
			continue;
		}
		WARN(mem->invalid, "Valid BO is marked invalid");

		if (mem->invalid) {
			WARN(1, "Valid BO is marked invalid");
			ret = -EAGAIN;
			continue;
		}

		list_move_tail(&mem->validate_list.head,
			       &process_info->userptr_valid_list);