Commit 46990918 authored by Danilo Krummrich's avatar Danilo Krummrich
Browse files

drm/nouveau: enable dynamic job-flow control



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: default avatarDanilo Krummrich <dakr@redhat.com>
Reviewed-by: default avatarDave Airlie <airlied@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231114002728.3491-2-dakr@redhat.com
parent 5f03a507
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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;

+1 −1
Original line number Diff line number Diff line
@@ -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;

+3 −1
Original line number Diff line number Diff line
@@ -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;
+4 −5
Original line number Diff line number Diff line
@@ -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)
@@ -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;

@@ -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;
@@ -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;
+2 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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
Loading