Commit c2b08e7a authored by Christian König's avatar Christian König Committed by Alex Deucher

drm/amdgpu: move entity selection and job init earlier during CS

Initialize the entity for the CS and scheduler job much earlier.

v2: fix job initialisation order and use correct scheduler instance
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 4953b6b2
...@@ -68,6 +68,25 @@ static int amdgpu_cs_p1_ib(struct amdgpu_cs_parser *p, ...@@ -68,6 +68,25 @@ static int amdgpu_cs_p1_ib(struct amdgpu_cs_parser *p,
struct drm_amdgpu_cs_chunk_ib *chunk_ib, struct drm_amdgpu_cs_chunk_ib *chunk_ib,
unsigned int *num_ibs) unsigned int *num_ibs)
{ {
struct drm_sched_entity *entity;
int r;
r = amdgpu_ctx_get_entity(p->ctx, chunk_ib->ip_type,
chunk_ib->ip_instance,
chunk_ib->ring, &entity);
if (r)
return r;
/* Abort if there is no run queue associated with this entity.
* Possibly because of disabled HW IP*/
if (entity->rq == NULL)
return -EINVAL;
/* Currently we don't support submitting to multiple entities */
if (p->entity && p->entity != entity)
return -EINVAL;
p->entity = entity;
++(*num_ibs); ++(*num_ibs);
return 0; return 0;
} }
...@@ -250,6 +269,10 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p, ...@@ -250,6 +269,10 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,
if (ret) if (ret)
goto free_all_kdata; goto free_all_kdata;
ret = drm_sched_job_init(&p->job->base, p->entity, &fpriv->vm);
if (ret)
goto free_all_kdata;
if (p->ctx->vram_lost_counter != p->job->vram_lost_counter) { if (p->ctx->vram_lost_counter != p->job->vram_lost_counter) {
ret = -ECANCELED; ret = -ECANCELED;
goto free_all_kdata; goto free_all_kdata;
...@@ -286,32 +309,11 @@ static int amdgpu_cs_p2_ib(struct amdgpu_cs_parser *p, ...@@ -286,32 +309,11 @@ static int amdgpu_cs_p2_ib(struct amdgpu_cs_parser *p,
{ {
struct drm_amdgpu_cs_chunk_ib *chunk_ib = chunk->kdata; struct drm_amdgpu_cs_chunk_ib *chunk_ib = chunk->kdata;
struct amdgpu_fpriv *fpriv = p->filp->driver_priv; struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
struct amdgpu_ring *ring = amdgpu_job_ring(p->job);
struct amdgpu_ib *ib = &p->job->ibs[*num_ibs]; struct amdgpu_ib *ib = &p->job->ibs[*num_ibs];
struct amdgpu_vm *vm = &fpriv->vm; struct amdgpu_vm *vm = &fpriv->vm;
struct drm_sched_entity *entity;
struct amdgpu_ring *ring;
int r; int r;
r = amdgpu_ctx_get_entity(p->ctx, chunk_ib->ip_type,
chunk_ib->ip_instance,
chunk_ib->ring, &entity);
if (r)
return r;
/*
* Abort if there is no run queue associated with this entity.
* Possibly because of disabled HW IP.
*/
if (entity->rq == NULL)
return -EINVAL;
/* Currently we don't support submitting to multiple entities */
if (p->entity && p->entity != entity)
return -EINVAL;
p->entity = entity;
ring = to_amdgpu_ring(entity->rq->sched);
/* MM engine doesn't support user fences */ /* MM engine doesn't support user fences */
if (p->uf_entry.tv.bo && ring->funcs->no_user_fence) if (p->uf_entry.tv.bo && ring->funcs->no_user_fence)
return -EINVAL; return -EINVAL;
...@@ -978,8 +980,8 @@ static void trace_amdgpu_cs_ibs(struct amdgpu_cs_parser *parser) ...@@ -978,8 +980,8 @@ static void trace_amdgpu_cs_ibs(struct amdgpu_cs_parser *parser)
static int amdgpu_cs_patch_ibs(struct amdgpu_cs_parser *p) static int amdgpu_cs_patch_ibs(struct amdgpu_cs_parser *p)
{ {
struct amdgpu_ring *ring = to_amdgpu_ring(p->entity->rq->sched);
struct amdgpu_job *job = p->job; struct amdgpu_job *job = p->job;
struct amdgpu_ring *ring = amdgpu_job_ring(job);
unsigned int i; unsigned int i;
int r; int r;
...@@ -1171,10 +1173,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, ...@@ -1171,10 +1173,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
job = p->job; job = p->job;
p->job = NULL; p->job = NULL;
r = drm_sched_job_init(&job->base, p->entity, &fpriv->vm);
if (r)
goto error_unlock;
drm_sched_job_arm(&job->base); drm_sched_job_arm(&job->base);
/* No memory allocation is allowed while holding the notifier lock. /* No memory allocation is allowed while holding the notifier lock.
...@@ -1231,8 +1229,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, ...@@ -1231,8 +1229,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
error_abort: error_abort:
drm_sched_job_cleanup(&job->base); drm_sched_job_cleanup(&job->base);
mutex_unlock(&p->adev->notifier_lock); mutex_unlock(&p->adev->notifier_lock);
error_unlock:
amdgpu_job_free(job); amdgpu_job_free(job);
return r; return r;
} }
......
...@@ -72,6 +72,11 @@ struct amdgpu_job { ...@@ -72,6 +72,11 @@ struct amdgpu_job {
struct amdgpu_ib ibs[]; struct amdgpu_ib ibs[];
}; };
static inline struct amdgpu_ring *amdgpu_job_ring(struct amdgpu_job *job)
{
return to_amdgpu_ring(job->base.entity->rq->sched);
}
int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
struct amdgpu_job **job, struct amdgpu_vm *vm); struct amdgpu_job **job, struct amdgpu_vm *vm);
int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size, int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size,
......
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