diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 30 | 
1 files changed, 6 insertions, 24 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index defb511acc5a..744e6ff69814 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -29,6 +29,7 @@  #include <linux/pagemap.h>  #include <linux/sync_file.h>  #include <linux/dma-buf.h> +#include <linux/hmm.h>  #include <drm/amdgpu_drm.h>  #include <drm/drm_syncobj.h> @@ -885,24 +886,12 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,  		struct amdgpu_bo *bo = e->bo;  		int i; -		e->user_pages = kvcalloc(bo->tbo.ttm->num_pages, -					 sizeof(struct page *), -					 GFP_KERNEL); -		if (!e->user_pages) { -			drm_err(adev_to_drm(p->adev), "kvmalloc_array failure\n"); -			r = -ENOMEM; -			goto out_free_user_pages; -		} - -		r = amdgpu_ttm_tt_get_user_pages(bo, e->user_pages, &e->range); -		if (r) { -			kvfree(e->user_pages); -			e->user_pages = NULL; +		r = amdgpu_ttm_tt_get_user_pages(bo, &e->range); +		if (r)  			goto out_free_user_pages; -		}  		for (i = 0; i < bo->tbo.ttm->num_pages; i++) { -			if (bo->tbo.ttm->pages[i] != e->user_pages[i]) { +			if (bo->tbo.ttm->pages[i] != hmm_pfn_to_page(e->range->hmm_pfns[i])) {  				userpage_invalidated = true;  				break;  			} @@ -946,7 +935,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,  		}  		if (amdgpu_ttm_tt_is_userptr(e->bo->tbo.ttm) && -		    e->user_invalidated && e->user_pages) { +		    e->user_invalidated) {  			amdgpu_bo_placement_from_domain(e->bo,  							AMDGPU_GEM_DOMAIN_CPU);  			r = ttm_bo_validate(&e->bo->tbo, &e->bo->placement, @@ -955,11 +944,8 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,  				goto out_free_user_pages;  			amdgpu_ttm_tt_set_user_pages(e->bo->tbo.ttm, -						     e->user_pages); +						     e->range);  		} - -		kvfree(e->user_pages); -		e->user_pages = NULL;  	}  	amdgpu_cs_get_threshold_for_moves(p->adev, &p->bytes_moved_threshold, @@ -1001,11 +987,7 @@ out_free_user_pages:  	amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {  		struct amdgpu_bo *bo = e->bo; -		if (!e->user_pages) -			continue;  		amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm, e->range); -		kvfree(e->user_pages); -		e->user_pages = NULL;  		e->range = NULL;  	}  	mutex_unlock(&p->bo_list->bo_list_mutex); | 
