Commit 3da2c382 authored by Philip Yang's avatar Philip Yang Committed by Alex Deucher
Browse files

drm/amdgpu: Free user pages if amdgpu_cs_parser_bos failed



Otherwise userspace resubmit the BOs again will trigger kernel WARNING
and fail the command submission.

Signed-off-by: default avatarPhilip Yang <Philip.Yang@amd.com>
Tested-by: default avatarRobert Święcki <robert@swiecki.net>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 86e18ac3
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -550,7 +550,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
		if (r) {
			kvfree(e->user_pages);
			e->user_pages = NULL;
			return r;
			goto out_free_user_pages;
		}

		for (i = 0; i < bo->tbo.ttm->num_pages; i++) {
@@ -567,7 +567,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
	if (unlikely(r != 0)) {
		if (r != -ERESTARTSYS)
			DRM_ERROR("ttm_eu_reserve_buffers failed.\n");
		goto out;
		goto out_free_user_pages;
	}

	amdgpu_bo_list_for_each_entry(e, p->bo_list) {
@@ -649,7 +649,19 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
		}
		ttm_eu_backoff_reservation(&p->ticket, &p->validated);
	}
out:

out_free_user_pages:
	if (r) {
		amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
			struct amdgpu_bo *bo = ttm_to_amdgpu_bo(e->tv.bo);

			if (!e->user_pages)
				continue;
			amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm);
			kvfree(e->user_pages);
			e->user_pages = NULL;
		}
	}
	return r;
}