All of lore.kernel.org
 help / color / mirror / Atom feed
From: Felix Kuehling <felix.kuehling-5C7GfCeVMHo@public.gmane.org>
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
	"Christian König"
	<deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
Subject: Re: [PATCH 4/5] drm/amdgpu: enable amdgpu_move_blit to handle multiple MM nodes
Date: Mon, 29 Aug 2016 18:09:12 -0400	[thread overview]
Message-ID: <74ea6d48-f9fc-57e0-7c02-8aab9f3f8567@amd.com> (raw)
In-Reply-To: <1472462424-3052-5-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>

This requires an assumption that there is no partial overlap between the
the mm_nodes in the old and new memory. As long as BOs are always split
into fixed size portions that should work OK for copying between linear
and split BOs. But it can fail if you copy between split BOs that are
split in different size portions.

For example this won't work:

     +-------+-------+-------+
Old: |  o0   |  o1   |  o2   |
     +-------+-------+-------+

     +-----------+-----------+
New: |    n0     |    n1     |
     +-----------+-----------+


Regards,
  Felix

On 16-08-29 05:20 AM, Christian König wrote:
> From: Christian König <christian.koenig@amd.com>
>
> This allows us to move scattered buffers around.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 96 ++++++++++++++++++++++-----------
>  1 file changed, 64 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index ea480bb..db8638b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -239,52 +239,84 @@ static void amdgpu_move_null(struct ttm_buffer_object *bo,
>  	new_mem->mm_node = NULL;
>  }
>  
> -static int amdgpu_move_blit(struct ttm_buffer_object *bo,
> -			bool evict, bool no_wait_gpu,
> -			struct ttm_mem_reg *new_mem,
> -			struct ttm_mem_reg *old_mem)
> +static uint64_t amdgpu_mm_node_addr(struct amdgpu_device *adev,
> +				    struct drm_mm_node *mm_node,
> +				    struct ttm_mem_reg *mem)
>  {
> -	struct amdgpu_device *adev;
> -	struct amdgpu_ring *ring;
> -	uint64_t old_start, new_start;
> -	struct fence *fence;
> -	int r;
> +	uint64_t addr = mm_node->start << PAGE_SHIFT;
>  
> -	adev = amdgpu_get_adev(bo->bdev);
> -	ring = adev->mman.buffer_funcs_ring;
> -	old_start = (u64)old_mem->start << PAGE_SHIFT;
> -	new_start = (u64)new_mem->start << PAGE_SHIFT;
> -
> -	switch (old_mem->mem_type) {
> +	switch (mem->mem_type) {
>  	case TTM_PL_VRAM:
>  	case TTM_PL_TT:
> -		old_start += bo->bdev->man[old_mem->mem_type].gpu_offset;
> +		addr += adev->mman.bdev.man[mem->mem_type].gpu_offset;
>  		break;
>  	default:
> -		DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
> -		return -EINVAL;
> -	}
> -	switch (new_mem->mem_type) {
> -	case TTM_PL_VRAM:
> -	case TTM_PL_TT:
> -		new_start += bo->bdev->man[new_mem->mem_type].gpu_offset;
> +		DRM_ERROR("Unknown placement %d\n", mem->mem_type);
>  		break;
> -	default:
> -		DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
> -		return -EINVAL;
>  	}
> +
> +	return addr;
> +}
> +
> +static int amdgpu_move_blit(struct ttm_buffer_object *bo,
> +			    bool evict, bool no_wait_gpu,
> +			    struct ttm_mem_reg *new_mem,
> +			    struct ttm_mem_reg *old_mem)
> +{
> +	struct amdgpu_device *adev = amdgpu_get_adev(bo->bdev);
> +	struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
> +
> +	struct drm_mm_node *old_mm, *new_mm;
> +	uint64_t old_start, new_start;
> +	unsigned long num_pages;
> +	struct fence *fence = NULL;
> +	int r;
> +
> +	BUILD_BUG_ON((PAGE_SIZE % AMDGPU_GPU_PAGE_SIZE) != 0);
> +
>  	if (!ring->ready) {
>  		DRM_ERROR("Trying to move memory with ring turned off.\n");
>  		return -EINVAL;
>  	}
>  
> -	BUILD_BUG_ON((PAGE_SIZE % AMDGPU_GPU_PAGE_SIZE) != 0);
> +	old_mm = old_mem->mm_node;
> +	new_mm = new_mem->mm_node;
> +	num_pages = new_mem->num_pages;
>  
> -	r = amdgpu_copy_buffer(ring, old_start, new_start,
> -			       new_mem->num_pages * PAGE_SIZE, /* bytes */
> -			       bo->resv, &fence, false);
> -	if (r)
> -		return r;
> +	old_start = amdgpu_mm_node_addr(adev, old_mm, old_mem);
> +	new_start = amdgpu_mm_node_addr(adev, new_mm, new_mem);
> +
> +	while (num_pages) {
> +		unsigned long cur_pages = min(old_mm->size, new_mm->size);
> +		struct fence *next;
> +
> +		r = amdgpu_copy_buffer(ring, old_start, new_start,
> +				       cur_pages * PAGE_SIZE,
> +				       bo->resv, &next, false);
> +		if (r) {
> +			if (fence)
> +				fence_wait(fence, false);
> +			fence_put(fence);
> +			return r;
> +		}
> +		fence_put(fence);
> +		fence = next;
> +
> +		num_pages -= cur_pages;
> +		if (num_pages) {
> +			old_start += cur_pages * PAGE_SIZE;
> +			if (old_start == ((old_mm->start + old_mm->size) *
> +				PAGE_SIZE))
> +				old_start = amdgpu_mm_node_addr(adev, ++old_mm,
> +								old_mem);
> +
> +			new_start += cur_pages * PAGE_SIZE;
> +			if (new_start == ((new_mm->start + new_mm->size) *
> +					  PAGE_SIZE))
> +				new_start = amdgpu_mm_node_addr(adev, ++new_mm,
> +								new_mem);
> +		}
> +	}
>  
>  	r = ttm_bo_pipeline_move(bo, fence, evict, new_mem);
>  	fence_put(fence);

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

  parent reply	other threads:[~2016-08-29 22:09 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-29  9:20 Split large VRAM allocations into smaller parts Christian König
     [not found] ` <1472462424-3052-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-08-29  9:20   ` [PATCH 1/5] drm/amdgpu: add AMDGPU_GEM_CREATE_VRAM_LINEAR flag v2 Christian König
     [not found]     ` <1472462424-3052-2-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-08-29 11:02       ` Edward O'Callaghan
2016-08-29 13:47       ` Deucher, Alexander
     [not found]         ` <MWHPR12MB1694759D47B2D6579C5D8F5BF7E10-Gy0DoCVfaSW4WA4dJ5YXGAdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2016-08-30  0:57           ` Michel Dänzer
     [not found]             ` <8221ebac-36e1-7a5b-2d02-92db63c4cc24-otUistvHUpPR7s880joybQ@public.gmane.org>
2016-08-30  1:49               ` Flora Cui
2016-08-30  7:44                 ` Christian König
2016-08-30 17:33       ` William Lewis
     [not found]         ` <BY2PR17MB02955F1C52893FDD92B1D78CC8E00-x8ynOugG3EHUsavx+kKoj3+GY4YGzQ7gvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2016-08-30 18:42           ` Alex Deucher
2016-08-29  9:20   ` [PATCH 2/5] drm/amdgpu: use explicit limit for VRAM_LINEAR handling Christian König
     [not found]     ` <1472462424-3052-3-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-08-29 10:59       ` Edward O'Callaghan
2016-08-29  9:20   ` [PATCH 3/5] drm/amdgpu: handle multiple MM nodes in the VMs Christian König
     [not found]     ` <1472462424-3052-4-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-08-29 22:29       ` Felix Kuehling
2016-08-29  9:20   ` [PATCH 4/5] drm/amdgpu: enable amdgpu_move_blit to handle multiple MM nodes Christian König
     [not found]     ` <1472462424-3052-5-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-08-29 22:09       ` Felix Kuehling [this message]
2016-08-29  9:20   ` [PATCH 5/5] drm/amdgpu: add VRAM manager Christian König
     [not found]     ` <1472462424-3052-6-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-08-29 10:27       ` Edward O'Callaghan
2016-08-30 17:37       ` William Lewis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=74ea6d48-f9fc-57e0-7c02-8aab9f3f8567@amd.com \
    --to=felix.kuehling-5c7gfcevmho@public.gmane.org \
    --cc=amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    --cc=deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.