Commit d1ff9086 authored by Chunming Zhou's avatar Chunming Zhou Committed by Alex Deucher

drm/amdgpu: fix seq in ctx_add_fence

if enabling scheduler, then the queued seq is assigned
when pushing job before emitting job.
Signed-off-by: default avatarChunming Zhou <david1.zhou@amd.com>
Reviewed-by: default avatarChristian K?nig <christian.koenig@amd.com>
parent 51b9db27
...@@ -419,7 +419,6 @@ struct amdgpu_user_fence { ...@@ -419,7 +419,6 @@ struct amdgpu_user_fence {
struct amdgpu_bo *bo; struct amdgpu_bo *bo;
/* write-back address offset to bo start */ /* write-back address offset to bo start */
uint32_t offset; uint32_t offset;
uint64_t sequence;
}; };
int amdgpu_fence_driver_init(struct amdgpu_device *adev); int amdgpu_fence_driver_init(struct amdgpu_device *adev);
...@@ -1031,7 +1030,7 @@ struct amdgpu_ctx *amdgpu_ctx_get(struct amdgpu_fpriv *fpriv, uint32_t id); ...@@ -1031,7 +1030,7 @@ struct amdgpu_ctx *amdgpu_ctx_get(struct amdgpu_fpriv *fpriv, uint32_t id);
int amdgpu_ctx_put(struct amdgpu_ctx *ctx); int amdgpu_ctx_put(struct amdgpu_ctx *ctx);
uint64_t amdgpu_ctx_add_fence(struct amdgpu_ctx *ctx, struct amdgpu_ring *ring, uint64_t amdgpu_ctx_add_fence(struct amdgpu_ctx *ctx, struct amdgpu_ring *ring,
struct fence *fence); struct fence *fence, uint64_t queued_seq);
struct fence *amdgpu_ctx_get_fence(struct amdgpu_ctx *ctx, struct fence *amdgpu_ctx_get_fence(struct amdgpu_ctx *ctx,
struct amdgpu_ring *ring, uint64_t seq); struct amdgpu_ring *ring, uint64_t seq);
......
...@@ -739,7 +739,6 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev, ...@@ -739,7 +739,6 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev,
ib->oa_size = amdgpu_bo_size(oa); ib->oa_size = amdgpu_bo_size(oa);
} }
} }
/* wrap the last IB with user fence */ /* wrap the last IB with user fence */
if (parser->uf.bo) { if (parser->uf.bo) {
struct amdgpu_ib *ib = &parser->ibs[parser->num_ibs - 1]; struct amdgpu_ib *ib = &parser->ibs[parser->num_ibs - 1];
...@@ -908,7 +907,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) ...@@ -908,7 +907,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
if (amdgpu_enable_scheduler && parser->num_ibs) { if (amdgpu_enable_scheduler && parser->num_ibs) {
struct amdgpu_ring * ring = struct amdgpu_ring * ring =
amdgpu_cs_parser_get_ring(adev, parser); amdgpu_cs_parser_get_ring(adev, parser);
parser->uf.sequence = atomic64_inc_return( parser->ibs[parser->num_ibs - 1].sequence = atomic64_inc_return(
&parser->ctx->rings[ring->idx].c_entity.last_queued_v_seq); &parser->ctx->rings[ring->idx].c_entity.last_queued_v_seq);
if (ring->is_pte_ring || (parser->bo_list && parser->bo_list->has_userptr)) { if (ring->is_pte_ring || (parser->bo_list && parser->bo_list->has_userptr)) {
r = amdgpu_cs_parser_prepare_job(parser); r = amdgpu_cs_parser_prepare_job(parser);
...@@ -922,7 +921,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) ...@@ -922,7 +921,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
amd_sched_push_job(ring->scheduler, amd_sched_push_job(ring->scheduler,
&parser->ctx->rings[ring->idx].c_entity, &parser->ctx->rings[ring->idx].c_entity,
parser); parser);
cs->out.handle = parser->uf.sequence; cs->out.handle = parser->ibs[parser->num_ibs - 1].sequence;
up_read(&adev->exclusive_lock); up_read(&adev->exclusive_lock);
return 0; return 0;
} }
......
...@@ -258,7 +258,7 @@ int amdgpu_ctx_put(struct amdgpu_ctx *ctx) ...@@ -258,7 +258,7 @@ int amdgpu_ctx_put(struct amdgpu_ctx *ctx)
} }
uint64_t amdgpu_ctx_add_fence(struct amdgpu_ctx *ctx, struct amdgpu_ring *ring, uint64_t amdgpu_ctx_add_fence(struct amdgpu_ctx *ctx, struct amdgpu_ring *ring,
struct fence *fence) struct fence *fence, uint64_t queued_seq)
{ {
struct amdgpu_ctx_ring *cring = & ctx->rings[ring->idx]; struct amdgpu_ctx_ring *cring = & ctx->rings[ring->idx];
uint64_t seq = 0; uint64_t seq = 0;
...@@ -266,7 +266,7 @@ uint64_t amdgpu_ctx_add_fence(struct amdgpu_ctx *ctx, struct amdgpu_ring *ring, ...@@ -266,7 +266,7 @@ uint64_t amdgpu_ctx_add_fence(struct amdgpu_ctx *ctx, struct amdgpu_ring *ring,
struct fence *other = NULL; struct fence *other = NULL;
if (amdgpu_enable_scheduler) if (amdgpu_enable_scheduler)
seq = atomic64_read(&cring->c_entity.last_queued_v_seq); seq = queued_seq;
else else
seq = cring->sequence; seq = cring->sequence;
idx = seq % AMDGPU_CTX_MAX_CS_PENDING; idx = seq % AMDGPU_CTX_MAX_CS_PENDING;
......
...@@ -143,6 +143,7 @@ int amdgpu_ib_schedule(struct amdgpu_device *adev, unsigned num_ibs, ...@@ -143,6 +143,7 @@ int amdgpu_ib_schedule(struct amdgpu_device *adev, unsigned num_ibs,
struct amdgpu_ring *ring; struct amdgpu_ring *ring;
struct amdgpu_ctx *ctx, *old_ctx; struct amdgpu_ctx *ctx, *old_ctx;
struct amdgpu_vm *vm; struct amdgpu_vm *vm;
uint64_t sequence;
unsigned i; unsigned i;
int r = 0; int r = 0;
...@@ -215,9 +216,12 @@ int amdgpu_ib_schedule(struct amdgpu_device *adev, unsigned num_ibs, ...@@ -215,9 +216,12 @@ int amdgpu_ib_schedule(struct amdgpu_device *adev, unsigned num_ibs,
return r; return r;
} }
sequence = amdgpu_enable_scheduler ? ib->sequence : 0;
if (ib->ctx) if (ib->ctx)
ib->sequence = amdgpu_ctx_add_fence(ib->ctx, ring, ib->sequence = amdgpu_ctx_add_fence(ib->ctx, ring,
&ib->fence->base); &ib->fence->base,
sequence);
/* wrap the last IB with fence */ /* wrap the last IB with fence */
if (ib->user) { if (ib->user) {
......
...@@ -62,7 +62,7 @@ static void amdgpu_sched_run_job(struct amd_gpu_scheduler *sched, ...@@ -62,7 +62,7 @@ static void amdgpu_sched_run_job(struct amd_gpu_scheduler *sched,
goto err; goto err;
} }
atomic64_set(&c_entity->last_emitted_v_seq, atomic64_set(&c_entity->last_emitted_v_seq,
sched_job->uf.sequence); sched_job->ibs[sched_job->num_ibs - 1].sequence);
wake_up_all(&c_entity->wait_emit); wake_up_all(&c_entity->wait_emit);
mutex_unlock(&sched_job->job_lock); mutex_unlock(&sched_job->job_lock);
...@@ -93,7 +93,7 @@ static void amdgpu_sched_process_job(struct amd_gpu_scheduler *sched, void *job) ...@@ -93,7 +93,7 @@ static void amdgpu_sched_process_job(struct amd_gpu_scheduler *sched, void *job)
if (sched_job->ctx) { if (sched_job->ctx) {
c_entity = &sched_job->ctx->rings[ring->idx].c_entity; c_entity = &sched_job->ctx->rings[ring->idx].c_entity;
atomic64_set(&c_entity->last_signaled_v_seq, atomic64_set(&c_entity->last_signaled_v_seq,
sched_job->uf.sequence); sched_job->ibs[sched_job->num_ibs - 1].sequence);
} }
/* wake up users waiting for time stamp */ /* wake up users waiting for time stamp */
......
...@@ -380,7 +380,7 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev, ...@@ -380,7 +380,7 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,
sched_job->run_job = amdgpu_vm_run_job; sched_job->run_job = amdgpu_vm_run_job;
sched_job->free_job = amdgpu_vm_free_job; sched_job->free_job = amdgpu_vm_free_job;
v_seq = atomic64_inc_return(&adev->kernel_ctx->rings[ring->idx].c_entity.last_queued_v_seq); v_seq = atomic64_inc_return(&adev->kernel_ctx->rings[ring->idx].c_entity.last_queued_v_seq);
sched_job->uf.sequence = v_seq; ib->sequence = v_seq;
amd_sched_push_job(ring->scheduler, amd_sched_push_job(ring->scheduler,
&adev->kernel_ctx->rings[ring->idx].c_entity, &adev->kernel_ctx->rings[ring->idx].c_entity,
sched_job); sched_job);
...@@ -531,7 +531,7 @@ int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, ...@@ -531,7 +531,7 @@ int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
sched_job->run_job = amdgpu_vm_run_job; sched_job->run_job = amdgpu_vm_run_job;
sched_job->free_job = amdgpu_vm_free_job; sched_job->free_job = amdgpu_vm_free_job;
v_seq = atomic64_inc_return(&adev->kernel_ctx->rings[ring->idx].c_entity.last_queued_v_seq); v_seq = atomic64_inc_return(&adev->kernel_ctx->rings[ring->idx].c_entity.last_queued_v_seq);
sched_job->uf.sequence = v_seq; ib->sequence = v_seq;
amd_sched_push_job(ring->scheduler, amd_sched_push_job(ring->scheduler,
&adev->kernel_ctx->rings[ring->idx].c_entity, &adev->kernel_ctx->rings[ring->idx].c_entity,
sched_job); sched_job);
...@@ -884,7 +884,7 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev, ...@@ -884,7 +884,7 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
sched_job->run_job = amdgpu_vm_bo_update_mapping_run_job; sched_job->run_job = amdgpu_vm_bo_update_mapping_run_job;
sched_job->free_job = amdgpu_vm_free_job; sched_job->free_job = amdgpu_vm_free_job;
v_seq = atomic64_inc_return(&adev->kernel_ctx->rings[ring->idx].c_entity.last_queued_v_seq); v_seq = atomic64_inc_return(&adev->kernel_ctx->rings[ring->idx].c_entity.last_queued_v_seq);
sched_job->uf.sequence = v_seq; ib->sequence = v_seq;
amd_sched_push_job(ring->scheduler, amd_sched_push_job(ring->scheduler,
&adev->kernel_ctx->rings[ring->idx].c_entity, &adev->kernel_ctx->rings[ring->idx].c_entity,
sched_job); sched_job);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment