drm/amdgpu: add dep_sync for amdgpu job
authorChunming Zhou <David1.Zhou@amd.com>
Thu, 18 May 2017 07:19:03 +0000 (15:19 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 24 May 2017 22:14:49 +0000 (18:14 -0400)
The fence in dep_sync cannot be optimized.

Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
Tested and Reviewed-by: Roger.He <Hongbo.He@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c

index 333413f481654d474def35654d2cadb8136f10a1..572e508d185f754c2a78be7426a91320343f4a3a 100644 (file)
@@ -1127,6 +1127,7 @@ struct amdgpu_job {
        struct amdgpu_vm        *vm;
        struct amdgpu_ring      *ring;
        struct amdgpu_sync      sync;
+       struct amdgpu_sync      dep_sync;
        struct amdgpu_sync      sched_sync;
        struct amdgpu_ib        *ibs;
        struct dma_fence        *fence; /* the hw fence */
index 53998615d3f1b97f7f9ac9340f23516e1abe6cda..3d641e10e6b65c728ddda00be6027d7fe42cc461 100644 (file)
@@ -63,6 +63,7 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
        (*job)->num_ibs = num_ibs;
 
        amdgpu_sync_create(&(*job)->sync);
+       amdgpu_sync_create(&(*job)->dep_sync);
        amdgpu_sync_create(&(*job)->sched_sync);
 
        return 0;
@@ -102,6 +103,7 @@ static void amdgpu_job_free_cb(struct amd_sched_job *s_job)
 
        dma_fence_put(job->fence);
        amdgpu_sync_free(&job->sync);
+       amdgpu_sync_free(&job->dep_sync);
        amdgpu_sync_free(&job->sched_sync);
        kfree(job);
 }
@@ -112,6 +114,7 @@ void amdgpu_job_free(struct amdgpu_job *job)
 
        dma_fence_put(job->fence);
        amdgpu_sync_free(&job->sync);
+       amdgpu_sync_free(&job->dep_sync);
        amdgpu_sync_free(&job->sched_sync);
        kfree(job);
 }
@@ -144,9 +147,16 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
        struct amdgpu_job *job = to_amdgpu_job(sched_job);
        struct amdgpu_vm *vm = job->vm;
 
-       struct dma_fence *fence = amdgpu_sync_get_fence(&job->sync);
+       struct dma_fence *fence = amdgpu_sync_get_fence(&job->dep_sync);
        int r;
 
+       if (amd_sched_dependency_optimized(fence, sched_job->s_entity)) {
+               r = amdgpu_sync_fence(job->adev, &job->sched_sync, fence);
+               if (r)
+                       DRM_ERROR("Error adding fence to sync (%d)\n", r);
+       }
+       if (!fence)
+               fence = amdgpu_sync_get_fence(&job->sync);
        while (fence == NULL && vm && !job->vm_id) {
                struct amdgpu_ring *ring = job->ring;
 
@@ -159,11 +169,6 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
                fence = amdgpu_sync_get_fence(&job->sync);
        }
 
-       if (amd_sched_dependency_optimized(fence, sched_job->s_entity)) {
-               r = amdgpu_sync_fence(job->adev, &job->sched_sync, fence);
-               if (r)
-                       DRM_ERROR("Error adding fence to sync (%d)\n", r);
-       }
        return fence;
 }