diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdkfd/kfd_migrate.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 33 | 
1 files changed, 19 insertions, 14 deletions
| diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c index de8ce72344fc..54933903bcb8 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c @@ -289,7 +289,7 @@ static unsigned long svm_migrate_unsuccessful_pages(struct migrate_vma *migrate)  static int  svm_migrate_copy_to_vram(struct amdgpu_device *adev, struct svm_range *prange,  			 struct migrate_vma *migrate, struct dma_fence **mfence, -			 dma_addr_t *scratch) +			 dma_addr_t *scratch, uint64_t ttm_res_offset)  {  	uint64_t npages = migrate->npages;  	struct device *dev = adev->dev; @@ -299,19 +299,13 @@ svm_migrate_copy_to_vram(struct amdgpu_device *adev, struct svm_range *prange,  	uint64_t i, j;  	int r; -	pr_debug("svms 0x%p [0x%lx 0x%lx]\n", prange->svms, prange->start, -		 prange->last); +	pr_debug("svms 0x%p [0x%lx 0x%lx 0x%llx]\n", prange->svms, prange->start, +		 prange->last, ttm_res_offset);  	src = scratch;  	dst = (uint64_t *)(scratch + npages); -	r = svm_range_vram_node_new(adev, prange, true); -	if (r) { -		dev_dbg(adev->dev, "fail %d to alloc vram\n", r); -		goto out; -	} - -	amdgpu_res_first(prange->ttm_res, prange->offset << PAGE_SHIFT, +	amdgpu_res_first(prange->ttm_res, ttm_res_offset,  			 npages << PAGE_SHIFT, &cursor);  	for (i = j = 0; i < npages; i++) {  		struct page *spage; @@ -391,14 +385,14 @@ out_free_vram_pages:  		migrate->dst[i + 3] = 0;  	}  #endif -out: +  	return r;  }  static long  svm_migrate_vma_to_vram(struct amdgpu_device *adev, struct svm_range *prange,  			struct vm_area_struct *vma, uint64_t start, -			uint64_t end, uint32_t trigger) +			uint64_t end, uint32_t trigger, uint64_t ttm_res_offset)  {  	struct kfd_process *p = container_of(prange->svms, struct kfd_process, svms);  	uint64_t npages = (end - start) >> PAGE_SHIFT; @@ -451,7 +445,7 @@ svm_migrate_vma_to_vram(struct amdgpu_device *adev, struct svm_range *prange,  	else  		pr_debug("0x%lx pages migrated\n", cpages); -	r = svm_migrate_copy_to_vram(adev, prange, &migrate, &mfence, scratch); +	r = svm_migrate_copy_to_vram(adev, prange, &migrate, &mfence, scratch, ttm_res_offset);  	migrate_vma_pages(&migrate);  	pr_debug("successful/cpages/npages 0x%lx/0x%lx/0x%lx\n", @@ -499,6 +493,7 @@ svm_migrate_ram_to_vram(struct svm_range *prange, uint32_t best_loc,  	unsigned long addr, start, end;  	struct vm_area_struct *vma;  	struct amdgpu_device *adev; +	uint64_t ttm_res_offset;  	unsigned long cpages = 0;  	long r = 0; @@ -520,6 +515,13 @@ svm_migrate_ram_to_vram(struct svm_range *prange, uint32_t best_loc,  	start = prange->start << PAGE_SHIFT;  	end = (prange->last + 1) << PAGE_SHIFT; +	r = svm_range_vram_node_new(adev, prange, true); +	if (r) { +		dev_dbg(adev->dev, "fail %ld to alloc vram\n", r); +		return r; +	} +	ttm_res_offset = prange->offset << PAGE_SHIFT; +  	for (addr = start; addr < end;) {  		unsigned long next; @@ -528,18 +530,21 @@ svm_migrate_ram_to_vram(struct svm_range *prange, uint32_t best_loc,  			break;  		next = min(vma->vm_end, end); -		r = svm_migrate_vma_to_vram(adev, prange, vma, addr, next, trigger); +		r = svm_migrate_vma_to_vram(adev, prange, vma, addr, next, trigger, ttm_res_offset);  		if (r < 0) {  			pr_debug("failed %ld to migrate\n", r);  			break;  		} else {  			cpages += r;  		} +		ttm_res_offset += next - addr;  		addr = next;  	}  	if (cpages)  		prange->actual_loc = best_loc; +	else +		svm_range_vram_node_free(prange);  	return r < 0 ? r : 0;  } |