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 <deathsim...@vodafone.de>
---
 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

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to