Subject: Re: linux-next: manual merge of the amdgpu tree with the drm-misc tree

From: Stephen Rothwell <[email-masked]>
Date: Fri, 4 Jun 2021 12:33:09 +1000

Hi all,

On Thu, 3 Jun 2021 12:48:47 +1000 Stephen Rothwell <[email-masked]> wrote:
>
> Today's linux-next merge of the amdgpu tree got conflicts in:
> 
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> 
> between commit:
> 
>   d3116756a710 ("drm/ttm: rename bo->mem and make it a pointer")
> 
> from the drm-misc tree and commits:
> 
>   b453e42a6e8b ("drm/amdgpu: Add new placement for preemptible SG BOs")
>   2a675640bc2d ("drm/amdgpu: move shadow bo validation to VM code")
>   59276f056fb7 ("drm/amdgpu: switch to amdgpu_bo_vm for vm code")
>   19a1d9350be6 ("drm/amdgpu: flush gart changes after all BO recovery")
> 
> from the amdgpu tree.
> 
> I fixed it up (see below) and can carry the fix as necessary. This
> is now fixed as far as linux-next is concerned, but any non trivial
> conflicts should be mentioned to your upstream maintainer when your tree
> is submitted for merging.  You may also want to consider cooperating
> with the maintainer of the conflicting tree to minimise any particularly
> complex conflicts.
> 
> -- 
> Cheers,
> Stephen Rothwell
> 
> diff --cc drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 663aa7d2e2ea,86259435803e..000000000000
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@@ -459,10 -479,11 +461,11 @@@ static int amdgpu_bo_move(struct ttm_bu
>   {
>   	struct amdgpu_device *adev;
>   	struct amdgpu_bo *abo;
>  -	struct ttm_resource *old_mem = &bo->mem;
>  +	struct ttm_resource *old_mem = bo->resource;
>   	int r;
>   
> - 	if (new_mem->mem_type == TTM_PL_TT) {
> + 	if (new_mem->mem_type == TTM_PL_TT ||
> + 	    new_mem->mem_type == AMDGPU_PL_PREEMPT) {
>   		r = amdgpu_ttm_backend_bind(bo->bdev, bo->ttm, new_mem);
>   		if (r)
>   			return r;
> @@@ -989,8 -1012,9 +995,9 @@@ int amdgpu_ttm_alloc_gart(struct ttm_bu
>   			return r;
>   		}
>   
> + 		amdgpu_gart_invalidate_tlb(adev);
>  -		ttm_resource_free(bo, &bo->mem);
>  -		bo->mem = tmp;
>  +		ttm_resource_free(bo, bo->resource);
>  +		ttm_bo_assign_mem(bo, &tmp);
>   	}
>   
>   	return 0;
> @@@ -1348,7 -1373,16 +1356,16 @@@ static bool amdgpu_ttm_bo_eviction_valu
>   		}
>   	}
>   
>  -	switch (bo->mem.mem_type) {
>  +	switch (bo->resource->mem_type) {
> + 	case AMDGPU_PL_PREEMPT:
> + 		/* Preemptible BOs don't own system resources managed by the
> + 		 * driver (pages, VRAM, GART space). They point to resources
> + 		 * owned by someone else (e.g. pageable memory in user mode
> + 		 * or a DMABuf). They are used in a preemptible context so we
> + 		 * can guarantee no deadlocks and good QoS in case of MMU
> + 		 * notifiers or DMABuf move notifiers from the resource owner.
> + 		 */
> + 		return false;
>   	case TTM_PL_TT:
>   		if (amdgpu_bo_is_amdgpu_bo(bo) &&
>   		    amdgpu_bo_encrypted(ttm_to_amdgpu_bo(bo)))
> @@@ -1767,8 -1809,13 +1791,9 @@@ void amdgpu_ttm_fini(struct amdgpu_devi
>   	amdgpu_bo_free_kernel(&adev->mman.discovery_memory, NULL, NULL);
>   	amdgpu_ttm_fw_reserve_vram_fini(adev);
>   
>  -	if (adev->mman.aper_base_kaddr)
>  -		iounmap(adev->mman.aper_base_kaddr);
>  -	adev->mman.aper_base_kaddr = NULL;
>  -
>   	amdgpu_vram_mgr_fini(adev);
>   	amdgpu_gtt_mgr_fini(adev);
> + 	amdgpu_preempt_mgr_fini(adev);
>   	ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_GDS);
>   	ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_GWS);
>   	ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_OA);
> @@@ -1919,7 -2010,12 +1944,12 @@@ int amdgpu_fill_buffer(struct amdgpu_b
>   		return -EINVAL;
>   	}
>   
>  -	if (bo->tbo.mem.mem_type == AMDGPU_PL_PREEMPT) {
> ++	if (bo->tbo.resource->mem_type == AMDGPU_PL_PREEMPT) {
> + 		DRM_ERROR("Trying to clear preemptible memory.\n");
> + 		return -EINVAL;
> + 	}
> + 
>  -	if (bo->tbo.mem.mem_type == TTM_PL_TT) {
>  +	if (bo->tbo.resource->mem_type == TTM_PL_TT) {
>   		r = amdgpu_ttm_alloc_gart(&bo->tbo);
>   		if (r)
>   			return r;
> diff --cc drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> index bcfd4a8d0288,1923f035713a..000000000000
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
> @@@ -657,11 -657,10 +658,11 @@@ void amdgpu_vm_move_to_lru_tail(struct 
>   		if (!bo->parent)
>   			continue;
>   
>  -		ttm_bo_move_to_lru_tail(&bo->tbo, &bo->tbo.mem,
>  +		ttm_bo_move_to_lru_tail(&bo->tbo, bo->tbo.resource,
>   					&vm->lru_bulk_move);
> - 		if (bo->shadow)
> - 			ttm_bo_move_to_lru_tail(&bo->shadow->tbo,
> + 		if (shadow)
>  -			ttm_bo_move_to_lru_tail(&shadow->tbo, &shadow->tbo.mem,
> ++			ttm_bo_move_to_lru_tail(&shadow->tbo,
>  +						shadow->tbo.resource,
>   						&vm->lru_bulk_move);
>   	}
>   	spin_unlock(&adev->mman.bdev.lru_lock);
> @@@ -1818,11 -1853,12 +1859,12 @@@ int amdgpu_vm_bo_update(struct amdgpu_d
>   			struct drm_gem_object *gobj = dma_buf->priv;
>   			struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);
>   
>  -			if (abo->tbo.mem.mem_type == TTM_PL_VRAM)
>  +			if (abo->tbo.resource->mem_type == TTM_PL_VRAM)
>   				bo = gem_to_amdgpu_bo(gobj);
>   		}
>  -		mem = &bo->tbo.mem;
>  +		mem = bo->tbo.resource;
> - 		if (mem->mem_type == TTM_PL_TT)
> + 		if (mem->mem_type == TTM_PL_TT ||
> + 		    mem->mem_type == AMDGPU_PL_PREEMPT)
>   			pages_addr = bo->tbo.ttm->dma_address;
>   	}
>   

This is now a conflict between the drm-misc tree and the drm tree.

(I fixed up the resolution above)

-- 
Cheers,
Stephen Rothwell