Skip to content

Commit

Permalink
drm/nouveau: enable dynamic job-flow control
Browse files Browse the repository at this point in the history
Make use of the scheduler's credit limit and scheduler job's credit
count to account for the actual size of a job, such that we fill up the
ring efficiently.

Signed-off-by: Danilo Krummrich <[email protected]>
Reviewed-by: Dave Airlie <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
  • Loading branch information
dakr committed Nov 24, 2023
1 parent 5f03a50 commit 4699091
Show file tree
Hide file tree
Showing 6 changed files with 15 additions and 10 deletions.
3 changes: 2 additions & 1 deletion drivers/gpu/drm/nouveau/nouveau_abi16.c
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,8 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
if (ret)
goto done;

ret = nouveau_sched_init(&chan->sched, drm, drm->sched_wq);
ret = nouveau_sched_init(&chan->sched, drm, drm->sched_wq,
chan->chan->dma.ib_max);
if (ret)
goto done;

Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/nouveau/nouveau_drm.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ nouveau_cli_init(struct nouveau_drm *drm, const char *sname,
* locks which indirectly or directly are held for allocations
* elsewhere.
*/
ret = nouveau_sched_init(&cli->sched, drm, NULL);
ret = nouveau_sched_init(&cli->sched, drm, NULL, 1);
if (ret)
goto done;

Expand Down
4 changes: 3 additions & 1 deletion drivers/gpu/drm/nouveau/nouveau_exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,10 +231,12 @@ nouveau_exec_job_init(struct nouveau_exec_job **pjob,
}
}

args.file_priv = __args->file_priv;
job->chan = __args->chan;

args.sched = __args->sched;
args.file_priv = __args->file_priv;
/* Plus one to account for the HW fence. */
args.credits = job->push.count + 1;

args.in_sync.count = __args->in_sync.count;
args.in_sync.s = __args->in_sync.s;
Expand Down
9 changes: 4 additions & 5 deletions drivers/gpu/drm/nouveau/nouveau_sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#include "nouveau_abi16.h"
#include "nouveau_sched.h"

#define NOUVEAU_SCHED_HW_SUBMISSIONS 1
#define NOUVEAU_SCHED_JOB_TIMEOUT_MS 10000

/* Starts at 0, since the DRM scheduler interprets those parameters as (initial)
Expand Down Expand Up @@ -85,10 +84,10 @@ nouveau_job_init(struct nouveau_job *job,
ret = -ENOMEM;
goto err_free_objs;
}

}

ret = drm_sched_job_init(&job->base, &sched->entity, 1, NULL);
ret = drm_sched_job_init(&job->base, &sched->entity,
args->credits, NULL);
if (ret)
goto err_free_chains;

Expand Down Expand Up @@ -401,7 +400,7 @@ static const struct drm_sched_backend_ops nouveau_sched_ops = {

int
nouveau_sched_init(struct nouveau_sched *sched, struct nouveau_drm *drm,
struct workqueue_struct *wq)
struct workqueue_struct *wq, u32 credit_limit)
{
struct drm_gpu_scheduler *drm_sched = &sched->base;
struct drm_sched_entity *entity = &sched->entity;
Expand All @@ -419,7 +418,7 @@ nouveau_sched_init(struct nouveau_sched *sched, struct nouveau_drm *drm,

ret = drm_sched_init(drm_sched, &nouveau_sched_ops, wq,
NOUVEAU_SCHED_PRIORITY_COUNT,
NOUVEAU_SCHED_HW_SUBMISSIONS, 0, job_hang_limit,
credit_limit, 0, job_hang_limit,
NULL, NULL, "nouveau_sched", drm->dev->dev);
if (ret)
goto fail_wq;
Expand Down
3 changes: 2 additions & 1 deletion drivers/gpu/drm/nouveau/nouveau_sched.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ enum nouveau_job_state {
struct nouveau_job_args {
struct drm_file *file_priv;
struct nouveau_sched *sched;
u32 credits;

enum dma_resv_usage resv_usage;
bool sync;
Expand Down Expand Up @@ -111,7 +112,7 @@ struct nouveau_sched {
};

int nouveau_sched_init(struct nouveau_sched *sched, struct nouveau_drm *drm,
struct workqueue_struct *wq);
struct workqueue_struct *wq, u32 credit_limit);
void nouveau_sched_fini(struct nouveau_sched *sched);

#endif
4 changes: 3 additions & 1 deletion drivers/gpu/drm/nouveau/nouveau_uvmm.c
Original file line number Diff line number Diff line change
Expand Up @@ -1607,9 +1607,11 @@ nouveau_uvmm_bind_job_init(struct nouveau_uvmm_bind_job **pjob,

init_completion(&job->complete);

args.sched = __args->sched;
args.file_priv = __args->file_priv;

args.sched = __args->sched;
args.credits = 1;

args.in_sync.count = __args->in_sync.count;
args.in_sync.s = __args->in_sync.s;

Expand Down

0 comments on commit 4699091

Please sign in to comment.