[PATCH 01/10] drm/radeon: remove radeon_fence_create

j.glisse j.glisse at gmail.com
Thu May 24 08:54:20 PDT 2012


On Thu, May 24, 2012 at 09:49:05AM +0200, Christian König wrote:
> It is completely unnecessary to create fences
> before they are emitted, so remove it and a bunch
> of checks if fences are emitted or not.
> 
> Signed-off-by: Christian König <deathsimple at vodafone.de>

Reviewed-by: Jerome Glisse <jglisse at redhat.com>

> ---
>  drivers/gpu/drm/radeon/evergreen.c        |    2 +-
>  drivers/gpu/drm/radeon/ni.c               |    2 +-
>  drivers/gpu/drm/radeon/r100.c             |    4 +-
>  drivers/gpu/drm/radeon/r200.c             |    4 +-
>  drivers/gpu/drm/radeon/r600.c             |    4 +-
>  drivers/gpu/drm/radeon/r600_blit_kms.c    |    6 +--
>  drivers/gpu/drm/radeon/radeon.h           |   11 +++--
>  drivers/gpu/drm/radeon/radeon_asic.h      |    8 ++--
>  drivers/gpu/drm/radeon/radeon_benchmark.c |   10 +----
>  drivers/gpu/drm/radeon/radeon_fence.c     |   42 ++++++------------
>  drivers/gpu/drm/radeon/radeon_ring.c      |   19 +++++----
>  drivers/gpu/drm/radeon/radeon_sa.c        |    2 +-
>  drivers/gpu/drm/radeon/radeon_test.c      |   66 ++++++++++++-----------------
>  drivers/gpu/drm/radeon/radeon_ttm.c       |   30 +++++--------
>  drivers/gpu/drm/radeon/si.c               |    6 +--
>  15 files changed, 86 insertions(+), 130 deletions(-)
> 
> diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
> index 58991af..dd3cea4 100644
> --- a/drivers/gpu/drm/radeon/evergreen.c
> +++ b/drivers/gpu/drm/radeon/evergreen.c
> @@ -1366,7 +1366,7 @@ void evergreen_mc_program(struct radeon_device *rdev)
>   */
>  void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
>  {
> -	struct radeon_ring *ring = &rdev->ring[ib->fence->ring];
> +	struct radeon_ring *ring = &rdev->ring[ib->ring];
>  
>  	/* set to DX10/11 mode */
>  	radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
> diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
> index b01c2dd..9d9f5ac 100644
> --- a/drivers/gpu/drm/radeon/ni.c
> +++ b/drivers/gpu/drm/radeon/ni.c
> @@ -1127,7 +1127,7 @@ void cayman_fence_ring_emit(struct radeon_device *rdev,
>  
>  void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
>  {
> -	struct radeon_ring *ring = &rdev->ring[ib->fence->ring];
> +	struct radeon_ring *ring = &rdev->ring[ib->ring];
>  
>  	/* set to DX10/11 mode */
>  	radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
> diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
> index fb44e7e..415b7d8 100644
> --- a/drivers/gpu/drm/radeon/r100.c
> +++ b/drivers/gpu/drm/radeon/r100.c
> @@ -883,7 +883,7 @@ int r100_copy_blit(struct radeon_device *rdev,
>  		   uint64_t src_offset,
>  		   uint64_t dst_offset,
>  		   unsigned num_gpu_pages,
> -		   struct radeon_fence *fence)
> +		   struct radeon_fence **fence)
>  {
>  	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
>  	uint32_t cur_pages;
> @@ -947,7 +947,7 @@ int r100_copy_blit(struct radeon_device *rdev,
>  			  RADEON_WAIT_HOST_IDLECLEAN |
>  			  RADEON_WAIT_DMA_GUI_IDLE);
>  	if (fence) {
> -		r = radeon_fence_emit(rdev, fence);
> +		r = radeon_fence_emit(rdev, fence, RADEON_RING_TYPE_GFX_INDEX);
>  	}
>  	radeon_ring_unlock_commit(rdev, ring);
>  	return r;
> diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c
> index a26144d..f088925 100644
> --- a/drivers/gpu/drm/radeon/r200.c
> +++ b/drivers/gpu/drm/radeon/r200.c
> @@ -85,7 +85,7 @@ int r200_copy_dma(struct radeon_device *rdev,
>  		  uint64_t src_offset,
>  		  uint64_t dst_offset,
>  		  unsigned num_gpu_pages,
> -		  struct radeon_fence *fence)
> +		  struct radeon_fence **fence)
>  {
>  	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
>  	uint32_t size;
> @@ -120,7 +120,7 @@ int r200_copy_dma(struct radeon_device *rdev,
>  	radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0));
>  	radeon_ring_write(ring, RADEON_WAIT_DMA_GUI_IDLE);
>  	if (fence) {
> -		r = radeon_fence_emit(rdev, fence);
> +		r = radeon_fence_emit(rdev, fence, RADEON_RING_TYPE_GFX_INDEX);
>  	}
>  	radeon_ring_unlock_commit(rdev, ring);
>  	return r;
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index f388a1d..e5279f9 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -2369,7 +2369,7 @@ int r600_copy_blit(struct radeon_device *rdev,
>  		   uint64_t src_offset,
>  		   uint64_t dst_offset,
>  		   unsigned num_gpu_pages,
> -		   struct radeon_fence *fence)
> +		   struct radeon_fence **fence)
>  {
>  	struct radeon_sa_bo *vb = NULL;
>  	int r;
> @@ -2670,7 +2670,7 @@ void r600_fini(struct radeon_device *rdev)
>   */
>  void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
>  {
> -	struct radeon_ring *ring = &rdev->ring[ib->fence->ring];
> +	struct radeon_ring *ring = &rdev->ring[ib->ring];
>  
>  	/* FIXME: implement */
>  	radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
> diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c
> index 03b6e0d..02f4eeb 100644
> --- a/drivers/gpu/drm/radeon/r600_blit_kms.c
> +++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
> @@ -703,20 +703,20 @@ int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
>  	return 0;
>  }
>  
> -void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence *fence,
> +void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence **fence,
>  			 struct radeon_sa_bo *vb)
>  {
>  	struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
>  	int r;
>  
> -	r = radeon_fence_emit(rdev, fence);
> +	r = radeon_fence_emit(rdev, fence, RADEON_RING_TYPE_GFX_INDEX);
>  	if (r) {
>  		radeon_ring_unlock_undo(rdev, ring);
>  		return;
>  	}
>  
>  	radeon_ring_unlock_commit(rdev, ring);
> -	radeon_sa_bo_free(rdev, &vb, fence);
> +	radeon_sa_bo_free(rdev, &vb, *fence);
>  }
>  
>  void r600_kms_blit_copy(struct radeon_device *rdev,
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 1dc3a4a..5e259b4 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -113,7 +113,6 @@ extern int radeon_lockup_timeout;
>  
>  /* fence seq are set to this number when signaled */
>  #define RADEON_FENCE_SIGNALED_SEQ		0LL
> -#define RADEON_FENCE_NOTEMITED_SEQ		(~0LL)
>  
>  /* internal ring indices */
>  /* r1xx+ has gfx CP ring */
> @@ -277,8 +276,7 @@ struct radeon_fence {
>  int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring);
>  int radeon_fence_driver_init(struct radeon_device *rdev);
>  void radeon_fence_driver_fini(struct radeon_device *rdev);
> -int radeon_fence_create(struct radeon_device *rdev, struct radeon_fence **fence, int ring);
> -int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence);
> +int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence **fence, int ring);
>  void radeon_fence_process(struct radeon_device *rdev, int ring);
>  bool radeon_fence_signaled(struct radeon_fence *fence);
>  int radeon_fence_wait(struct radeon_fence *fence, bool interruptible);
> @@ -627,6 +625,7 @@ struct radeon_ib {
>  	uint32_t			length_dw;
>  	uint64_t			gpu_addr;
>  	uint32_t			*ptr;
> +	int				ring;
>  	struct radeon_fence		*fence;
>  	unsigned			vm_id;
>  	bool				is_const_ib;
> @@ -1190,20 +1189,20 @@ struct radeon_asic {
>  			    uint64_t src_offset,
>  			    uint64_t dst_offset,
>  			    unsigned num_gpu_pages,
> -			    struct radeon_fence *fence);
> +			    struct radeon_fence **fence);
>  		u32 blit_ring_index;
>  		int (*dma)(struct radeon_device *rdev,
>  			   uint64_t src_offset,
>  			   uint64_t dst_offset,
>  			   unsigned num_gpu_pages,
> -			   struct radeon_fence *fence);
> +			   struct radeon_fence **fence);
>  		u32 dma_ring_index;
>  		/* method used for bo copy */
>  		int (*copy)(struct radeon_device *rdev,
>  			    uint64_t src_offset,
>  			    uint64_t dst_offset,
>  			    unsigned num_gpu_pages,
> -			    struct radeon_fence *fence);
> +			    struct radeon_fence **fence);
>  		/* ring used for bo copies */
>  		u32 copy_ring_index;
>  	} copy;
> diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
> index e76a941..8cdf075 100644
> --- a/drivers/gpu/drm/radeon/radeon_asic.h
> +++ b/drivers/gpu/drm/radeon/radeon_asic.h
> @@ -79,7 +79,7 @@ int r100_copy_blit(struct radeon_device *rdev,
>  		   uint64_t src_offset,
>  		   uint64_t dst_offset,
>  		   unsigned num_gpu_pages,
> -		   struct radeon_fence *fence);
> +		   struct radeon_fence **fence);
>  int r100_set_surface_reg(struct radeon_device *rdev, int reg,
>  			 uint32_t tiling_flags, uint32_t pitch,
>  			 uint32_t offset, uint32_t obj_size);
> @@ -144,7 +144,7 @@ extern int r200_copy_dma(struct radeon_device *rdev,
>  			 uint64_t src_offset,
>  			 uint64_t dst_offset,
>  			 unsigned num_gpu_pages,
> -			 struct radeon_fence *fence);
> +			 struct radeon_fence **fence);
>  void r200_set_safe_registers(struct radeon_device *rdev);
>  
>  /*
> @@ -318,7 +318,7 @@ void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
>  int r600_ring_test(struct radeon_device *rdev, struct radeon_ring *cp);
>  int r600_copy_blit(struct radeon_device *rdev,
>  		   uint64_t src_offset, uint64_t dst_offset,
> -		   unsigned num_gpu_pages, struct radeon_fence *fence);
> +		   unsigned num_gpu_pages, struct radeon_fence **fence);
>  void r600_hpd_init(struct radeon_device *rdev);
>  void r600_hpd_fini(struct radeon_device *rdev);
>  bool r600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd);
> @@ -364,7 +364,7 @@ void r600_hdmi_update_audio_settings(struct drm_encoder *encoder);
>  /* r600 blit */
>  int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
>  			   struct radeon_sa_bo **vb);
> -void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence *fence,
> +void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence **fence,
>  			 struct radeon_sa_bo *vb);
>  void r600_kms_blit_copy(struct radeon_device *rdev,
>  			u64 src_gpu_addr, u64 dst_gpu_addr,
> diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c
> index 364f5b1..bedda9c 100644
> --- a/drivers/gpu/drm/radeon/radeon_benchmark.c
> +++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
> @@ -45,20 +45,14 @@ static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size,
>  	for (i = 0; i < n; i++) {
>  		switch (flag) {
>  		case RADEON_BENCHMARK_COPY_DMA:
> -			r = radeon_fence_create(rdev, &fence, radeon_copy_dma_ring_index(rdev));
> -			if (r)
> -				return r;
>  			r = radeon_copy_dma(rdev, saddr, daddr,
>  					    size / RADEON_GPU_PAGE_SIZE,
> -					    fence);
> +					    &fence);
>  			break;
>  		case RADEON_BENCHMARK_COPY_BLIT:
> -			r = radeon_fence_create(rdev, &fence, radeon_copy_blit_ring_index(rdev));
> -			if (r)
> -				return r;
>  			r = radeon_copy_blit(rdev, saddr, daddr,
>  					     size / RADEON_GPU_PAGE_SIZE,
> -					     fence);
> +					     &fence);
>  			break;
>  		default:
>  			DRM_ERROR("Unknown copy method\n");
> diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
> index 11f5f40..401d346 100644
> --- a/drivers/gpu/drm/radeon/radeon_fence.c
> +++ b/drivers/gpu/drm/radeon/radeon_fence.c
> @@ -61,15 +61,21 @@ static u32 radeon_fence_read(struct radeon_device *rdev, int ring)
>  	return seq;
>  }
>  
> -int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence)
> +int radeon_fence_emit(struct radeon_device *rdev,
> +		      struct radeon_fence **fence,
> +		      int ring)
>  {
>  	/* we are protected by the ring emission mutex */
> -	if (fence->seq && fence->seq < RADEON_FENCE_NOTEMITED_SEQ) {
> -		return 0;
> +	*fence = kmalloc(sizeof(struct radeon_fence), GFP_KERNEL);
> +	if ((*fence) == NULL) {
> +		return -ENOMEM;
>  	}
> -	fence->seq = ++rdev->fence_drv[fence->ring].seq;
> -	radeon_fence_ring_emit(rdev, fence->ring, fence);
> -	trace_radeon_fence_emit(rdev->ddev, fence->seq);
> +	kref_init(&((*fence)->kref));
> +	(*fence)->rdev = rdev;
> +	(*fence)->seq = ++rdev->fence_drv[ring].seq;
> +	(*fence)->ring = ring;
> +	radeon_fence_ring_emit(rdev, ring, *fence);
> +	trace_radeon_fence_emit(rdev->ddev, (*fence)->seq);
>  	return 0;
>  }
>  
> @@ -138,25 +144,9 @@ static void radeon_fence_destroy(struct kref *kref)
>  	struct radeon_fence *fence;
>  
>  	fence = container_of(kref, struct radeon_fence, kref);
> -	fence->seq = RADEON_FENCE_NOTEMITED_SEQ;
>  	kfree(fence);
>  }
>  
> -int radeon_fence_create(struct radeon_device *rdev,
> -			struct radeon_fence **fence,
> -			int ring)
> -{
> -	*fence = kmalloc(sizeof(struct radeon_fence), GFP_KERNEL);
> -	if ((*fence) == NULL) {
> -		return -ENOMEM;
> -	}
> -	kref_init(&((*fence)->kref));
> -	(*fence)->rdev = rdev;
> -	(*fence)->seq = RADEON_FENCE_NOTEMITED_SEQ;
> -	(*fence)->ring = ring;
> -	return 0;
> -}
> -
>  static bool radeon_fence_seq_signaled(struct radeon_device *rdev,
>  				      u64 seq, unsigned ring)
>  {
> @@ -176,10 +166,6 @@ bool radeon_fence_signaled(struct radeon_fence *fence)
>  	if (!fence) {
>  		return true;
>  	}
> -	if (fence->seq == RADEON_FENCE_NOTEMITED_SEQ) {
> -		WARN(1, "Querying an unemitted fence : %p !\n", fence);
> -		return true;
> -	}
>  	if (fence->seq == RADEON_FENCE_SIGNALED_SEQ) {
>  		return true;
>  	}
> @@ -444,9 +430,7 @@ int radeon_fence_wait_any(struct radeon_device *rdev,
>  			return 0;
>  		}
>  
> -		if (fences[i]->seq < RADEON_FENCE_NOTEMITED_SEQ) {
> -			seq[i] = fences[i]->seq;
> -		}
> +		seq[i] = fences[i]->seq;
>  	}
>  
>  	r = radeon_fence_wait_any_seq(rdev, seq, intr);
> diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
> index 493a7be..a0b9970 100644
> --- a/drivers/gpu/drm/radeon/radeon_ring.c
> +++ b/drivers/gpu/drm/radeon/radeon_ring.c
> @@ -74,13 +74,9 @@ int radeon_ib_get(struct radeon_device *rdev, int ring,
>  		dev_err(rdev->dev, "failed to get a new IB (%d)\n", r);
>  		return r;
>  	}
> -	r = radeon_fence_create(rdev, &ib->fence, ring);
> -	if (r) {
> -		dev_err(rdev->dev, "failed to create fence for new IB (%d)\n", r);
> -		radeon_sa_bo_free(rdev, &ib->sa_bo, NULL);
> -		return r;
> -	}
>  
> +	ib->ring = ring;
> +	ib->fence = NULL;
>  	ib->ptr = radeon_sa_bo_cpu_addr(ib->sa_bo);
>  	ib->gpu_addr = radeon_sa_bo_gpu_addr(ib->sa_bo);
>  	ib->vm_id = 0;
> @@ -99,7 +95,7 @@ void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib)
>  
>  int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib)
>  {
> -	struct radeon_ring *ring = &rdev->ring[ib->fence->ring];
> +	struct radeon_ring *ring = &rdev->ring[ib->ring];
>  	int r = 0;
>  
>  	if (!ib->length_dw || !ring->ready) {
> @@ -114,8 +110,13 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib)
>  		dev_err(rdev->dev, "scheduling IB failed (%d).\n", r);
>  		return r;
>  	}
> -	radeon_ring_ib_execute(rdev, ib->fence->ring, ib);
> -	radeon_fence_emit(rdev, ib->fence);
> +	radeon_ring_ib_execute(rdev, ib->ring, ib);
> +	r = radeon_fence_emit(rdev, &ib->fence, ib->ring);
> +	if (r) {
> +		dev_err(rdev->dev, "failed to emit fence for new IB (%d)\n", r);
> +		radeon_ring_unlock_undo(rdev, ring);
> +		return r;
> +	}
>  	radeon_ring_unlock_commit(rdev, ring);
>  	return 0;
>  }
> diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c
> index 32059b7..81dbb5b 100644
> --- a/drivers/gpu/drm/radeon/radeon_sa.c
> +++ b/drivers/gpu/drm/radeon/radeon_sa.c
> @@ -349,7 +349,7 @@ void radeon_sa_bo_free(struct radeon_device *rdev, struct radeon_sa_bo **sa_bo,
>  
>  	sa_manager = (*sa_bo)->manager;
>  	spin_lock(&sa_manager->lock);
> -	if (fence && fence->seq && fence->seq < RADEON_FENCE_NOTEMITED_SEQ) {
> +	if (fence && !radeon_fence_signaled(fence)) {
>  		(*sa_bo)->fence = radeon_fence_ref(fence);
>  		list_add_tail(&(*sa_bo)->flist,
>  			      &sa_manager->flist[fence->ring]);
> diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c
> index efff929..47e1535 100644
> --- a/drivers/gpu/drm/radeon/radeon_test.c
> +++ b/drivers/gpu/drm/radeon/radeon_test.c
> @@ -106,13 +106,7 @@ void radeon_test_moves(struct radeon_device *rdev)
>  
>  		radeon_bo_kunmap(gtt_obj[i]);
>  
> -		r = radeon_fence_create(rdev, &fence, RADEON_RING_TYPE_GFX_INDEX);
> -		if (r) {
> -			DRM_ERROR("Failed to create GTT->VRAM fence %d\n", i);
> -			goto out_cleanup;
> -		}
> -
> -		r = radeon_copy(rdev, gtt_addr, vram_addr, size / RADEON_GPU_PAGE_SIZE, fence);
> +		r = radeon_copy(rdev, gtt_addr, vram_addr, size / RADEON_GPU_PAGE_SIZE, &fence);
>  		if (r) {
>  			DRM_ERROR("Failed GTT->VRAM copy %d\n", i);
>  			goto out_cleanup;
> @@ -155,13 +149,7 @@ void radeon_test_moves(struct radeon_device *rdev)
>  
>  		radeon_bo_kunmap(vram_obj);
>  
> -		r = radeon_fence_create(rdev, &fence, RADEON_RING_TYPE_GFX_INDEX);
> -		if (r) {
> -			DRM_ERROR("Failed to create VRAM->GTT fence %d\n", i);
> -			goto out_cleanup;
> -		}
> -
> -		r = radeon_copy(rdev, vram_addr, gtt_addr, size / RADEON_GPU_PAGE_SIZE, fence);
> +		r = radeon_copy(rdev, vram_addr, gtt_addr, size / RADEON_GPU_PAGE_SIZE, &fence);
>  		if (r) {
>  			DRM_ERROR("Failed VRAM->GTT copy %d\n", i);
>  			goto out_cleanup;
> @@ -245,17 +233,6 @@ void radeon_test_ring_sync(struct radeon_device *rdev,
>  	int ridxB = radeon_ring_index(rdev, ringB);
>  	int r;
>  
> -	r = radeon_fence_create(rdev, &fence1, ridxA);
> -	if (r) {
> -		DRM_ERROR("Failed to create sync fence 1\n");
> -		goto out_cleanup;
> -	}
> -	r = radeon_fence_create(rdev, &fence2, ridxA);
> -	if (r) {
> -		DRM_ERROR("Failed to create sync fence 2\n");
> -		goto out_cleanup;
> -	}
> -
>  	r = radeon_semaphore_create(rdev, &semaphore);
>  	if (r) {
>  		DRM_ERROR("Failed to create semaphore\n");
> @@ -268,9 +245,19 @@ void radeon_test_ring_sync(struct radeon_device *rdev,
>  		goto out_cleanup;
>  	}
>  	radeon_semaphore_emit_wait(rdev, ridxA, semaphore);
> -	radeon_fence_emit(rdev, fence1);
> +	r = radeon_fence_emit(rdev, &fence1, ridxA);
> +	if (r) {
> +		DRM_ERROR("Failed to emit fence 1\n");
> +		radeon_ring_unlock_undo(rdev, ringA);
> +		goto out_cleanup;
> +	}
>  	radeon_semaphore_emit_wait(rdev, ridxA, semaphore);
> -	radeon_fence_emit(rdev, fence2);
> +	r = radeon_fence_emit(rdev, &fence2, ridxA);
> +	if (r) {
> +		DRM_ERROR("Failed to emit fence 2\n");
> +		radeon_ring_unlock_undo(rdev, ringA);
> +		goto out_cleanup;
> +	}
>  	radeon_ring_unlock_commit(rdev, ringA);
>  
>  	mdelay(1000);
> @@ -342,17 +329,6 @@ void radeon_test_ring_sync2(struct radeon_device *rdev,
>  	bool sigA, sigB;
>  	int i, r;
>  
> -	r = radeon_fence_create(rdev, &fenceA, ridxA);
> -	if (r) {
> -		DRM_ERROR("Failed to create sync fence 1\n");
> -		goto out_cleanup;
> -	}
> -	r = radeon_fence_create(rdev, &fenceB, ridxB);
> -	if (r) {
> -		DRM_ERROR("Failed to create sync fence 2\n");
> -		goto out_cleanup;
> -	}
> -
>  	r = radeon_semaphore_create(rdev, &semaphore);
>  	if (r) {
>  		DRM_ERROR("Failed to create semaphore\n");
> @@ -365,7 +341,12 @@ void radeon_test_ring_sync2(struct radeon_device *rdev,
>  		goto out_cleanup;
>  	}
>  	radeon_semaphore_emit_wait(rdev, ridxA, semaphore);
> -	radeon_fence_emit(rdev, fenceA);
> +	r = radeon_fence_emit(rdev, &fenceA, ridxA);
> +	if (r) {
> +		DRM_ERROR("Failed to emit sync fence 1\n");
> +		radeon_ring_unlock_undo(rdev, ringA);
> +		goto out_cleanup;
> +	}
>  	radeon_ring_unlock_commit(rdev, ringA);
>  
>  	r = radeon_ring_lock(rdev, ringB, 64);
> @@ -374,7 +355,12 @@ void radeon_test_ring_sync2(struct radeon_device *rdev,
>  		goto out_cleanup;
>  	}
>  	radeon_semaphore_emit_wait(rdev, ridxB, semaphore);
> -	radeon_fence_emit(rdev, fenceB);
> +	r = radeon_fence_emit(rdev, &fenceB, ridxB);
> +	if (r) {
> +		DRM_ERROR("Failed to create sync fence 2\n");
> +		radeon_ring_unlock_undo(rdev, ringB);
> +		goto out_cleanup;
> +	}
>  	radeon_ring_unlock_commit(rdev, ringB);
>  
>  	mdelay(1000);
> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
> index c94a225..2d36bdd 100644
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -222,15 +222,12 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
>  {
>  	struct radeon_device *rdev;
>  	uint64_t old_start, new_start;
> -	struct radeon_fence *fence, *old_fence;
> +	struct radeon_fence *fence;
>  	struct radeon_semaphore *sem = NULL;
> -	int r;
> +	int r, ridx;
>  
>  	rdev = radeon_get_rdev(bo->bdev);
> -	r = radeon_fence_create(rdev, &fence, radeon_copy_ring_index(rdev));
> -	if (unlikely(r)) {
> -		return r;
> -	}
> +	ridx = radeon_copy_ring_index(rdev);
>  	old_start = old_mem->start << PAGE_SHIFT;
>  	new_start = new_mem->start << PAGE_SHIFT;
>  
> @@ -243,7 +240,6 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
>  		break;
>  	default:
>  		DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
> -		radeon_fence_unref(&fence);
>  		return -EINVAL;
>  	}
>  	switch (new_mem->mem_type) {
> @@ -255,42 +251,38 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
>  		break;
>  	default:
>  		DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
> -		radeon_fence_unref(&fence);
>  		return -EINVAL;
>  	}
> -	if (!rdev->ring[radeon_copy_ring_index(rdev)].ready) {
> +	if (!rdev->ring[ridx].ready) {
>  		DRM_ERROR("Trying to move memory with ring turned off.\n");
> -		radeon_fence_unref(&fence);
>  		return -EINVAL;
>  	}
>  
>  	BUILD_BUG_ON((PAGE_SIZE % RADEON_GPU_PAGE_SIZE) != 0);
>  
>  	/* sync other rings */
> -	old_fence = bo->sync_obj;
> -	if (old_fence && old_fence->ring != fence->ring
> -	    && !radeon_fence_signaled(old_fence)) {
> +	fence = bo->sync_obj;
> +	if (fence && fence->ring != ridx
> +	    && !radeon_fence_signaled(fence)) {
>  		bool sync_to_ring[RADEON_NUM_RINGS] = { };
> -		sync_to_ring[old_fence->ring] = true;
> +		sync_to_ring[fence->ring] = true;
>  
>  		r = radeon_semaphore_create(rdev, &sem);
>  		if (r) {
> -			radeon_fence_unref(&fence);
>  			return r;
>  		}
>  
> -		r = radeon_semaphore_sync_rings(rdev, sem,
> -						sync_to_ring, fence->ring);
> +		r = radeon_semaphore_sync_rings(rdev, sem, sync_to_ring, ridx);
>  		if (r) {
>  			radeon_semaphore_free(rdev, sem, NULL);
> -			radeon_fence_unref(&fence);
>  			return r;
>  		}
>  	}
>  
> +	fence = NULL;
>  	r = radeon_copy(rdev, old_start, new_start,
>  			new_mem->num_pages * (PAGE_SIZE / RADEON_GPU_PAGE_SIZE), /* GPU pages */
> -			fence);
> +			&fence);
>  	/* FIXME: handle copy error */
>  	r = ttm_bo_move_accel_cleanup(bo, (void *)fence, NULL,
>  				      evict, no_wait_reserve, no_wait_gpu, new_mem);
> diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
> index 549732e..5ca8ef5 100644
> --- a/drivers/gpu/drm/radeon/si.c
> +++ b/drivers/gpu/drm/radeon/si.c
> @@ -1915,7 +1915,7 @@ void si_fence_ring_emit(struct radeon_device *rdev,
>   */
>  void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
>  {
> -	struct radeon_ring *ring = &rdev->ring[ib->fence->ring];
> +	struct radeon_ring *ring = &rdev->ring[ib->ring];
>  	u32 header;
>  
>  	if (ib->is_const_ib)
> @@ -2855,7 +2855,7 @@ int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
>  			if (ib->is_const_ib)
>  				ret = si_vm_packet3_ce_check(rdev, ib->ptr, &pkt);
>  			else {
> -				switch (ib->fence->ring) {
> +				switch (ib->ring) {
>  				case RADEON_RING_TYPE_GFX_INDEX:
>  					ret = si_vm_packet3_gfx_check(rdev, ib->ptr, &pkt);
>  					break;
> @@ -2864,7 +2864,7 @@ int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)
>  					ret = si_vm_packet3_compute_check(rdev, ib->ptr, &pkt);
>  					break;
>  				default:
> -					dev_err(rdev->dev, "Non-PM4 ring %d !\n", ib->fence->ring);
> +					dev_err(rdev->dev, "Non-PM4 ring %d !\n", ib->ring);
>  					ret = -EINVAL;
>  					break;
>  				}
> -- 
> 1.7.9.5
> 


More information about the dri-devel mailing list