@@ -316,7 +316,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;
@@ -317,7 +317,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;
@@ -253,10 +253,11 @@ 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;
+ args.submission_units = job->push.count;
args.in_sync.count = __args->in_sync.count;
args.in_sync.s = __args->in_sync.s;
@@ -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
int
@@ -77,10 +76,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->submission_units, NULL);
if (ret)
goto err_free_chains;
@@ -387,7 +386,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 submission_limit)
{
struct drm_gpu_scheduler *drm_sched = &sched->base;
struct drm_sched_entity *entity = &sched->entity;
@@ -404,7 +403,7 @@ int nouveau_sched_init(struct nouveau_sched *sched, struct nouveau_drm *drm,
}
ret = drm_sched_init(drm_sched, &nouveau_sched_ops, wq,
- NOUVEAU_SCHED_HW_SUBMISSIONS, 0, job_hang_limit,
+ submission_limit, 0, job_hang_limit,
NULL, NULL, "nouveau_sched",
DRM_SCHED_POLICY_SINGLE_ENTITY, drm->dev->dev);
if (ret)
@@ -27,6 +27,7 @@ enum nouveau_job_state {
struct nouveau_job_args {
struct drm_file *file_priv;
struct nouveau_sched *sched;
+ u32 submission_units;
enum dma_resv_usage resv_usage;
bool sync;
@@ -112,7 +113,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 submission_limit);
void nouveau_sched_fini(struct nouveau_sched *sched);
#endif
Make use of the scheduler's submission limit and scheduler job's submission unit count to account for the actual size of a job, such that we fill up the ring efficiently. Signed-off-by: Danilo Krummrich <dakr@redhat.com> --- This patch is based on Matt's scheduler work [1] and [2]. [1] https://lore.kernel.org/dri-devel/20230919050155.2647172-1-matthew.brost@intel.com/ [2] https://lore.kernel.org/nouveau/20230924224555.15595-1-dakr@redhat.com/T/#u --- drivers/gpu/drm/nouveau/nouveau_abi16.c | 3 ++- drivers/gpu/drm/nouveau/nouveau_drm.c | 2 +- drivers/gpu/drm/nouveau/nouveau_exec.c | 3 ++- drivers/gpu/drm/nouveau/nouveau_sched.c | 9 ++++----- drivers/gpu/drm/nouveau/nouveau_sched.h | 3 ++- 5 files changed, 11 insertions(+), 9 deletions(-)