Commit dab1f855 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-misc-fixes-2025-09-11' of...

Merge tag 'drm-misc-fixes-2025-09-11' of https://gitlab.freedesktop.org/drm/misc/kernel

 into drm-fixes

A maintainer update, an out-of-bound check for panthor and a revert for
nouveau to fix a race.

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Maxime Ripard <mripard@redhat.com>
Link: https://lore.kernel.org/r/20250911-glistening-uakari-of-serendipity-06ceb1@houat
parents f2c8bbb6 87b90cee
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -8091,7 +8091,7 @@ X: drivers/gpu/drm/i915/
X:	drivers/gpu/drm/kmb/
X:	drivers/gpu/drm/mediatek/
X:	drivers/gpu/drm/msm/
X:	drivers/gpu/drm/nouveau/
X:	drivers/gpu/drm/nova/
X:	drivers/gpu/drm/radeon/
X:	drivers/gpu/drm/tegra/
X:	drivers/gpu/drm/xe/
+0 −15
Original line number Diff line number Diff line
@@ -240,21 +240,6 @@ nouveau_fence_emit(struct nouveau_fence *fence)
	return ret;
}

void
nouveau_fence_cancel(struct nouveau_fence *fence)
{
	struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
	unsigned long flags;

	spin_lock_irqsave(&fctx->lock, flags);
	if (!dma_fence_is_signaled_locked(&fence->base)) {
		dma_fence_set_error(&fence->base, -ECANCELED);
		if (nouveau_fence_signal(fence))
			nvif_event_block(&fctx->event);
	}
	spin_unlock_irqrestore(&fctx->lock, flags);
}

bool
nouveau_fence_done(struct nouveau_fence *fence)
{
+0 −1
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ void nouveau_fence_unref(struct nouveau_fence **);

int  nouveau_fence_emit(struct nouveau_fence *);
bool nouveau_fence_done(struct nouveau_fence *);
void nouveau_fence_cancel(struct nouveau_fence *fence);
int  nouveau_fence_wait(struct nouveau_fence *, bool lazy, bool intr);
int  nouveau_fence_sync(struct nouveau_bo *, struct nouveau_channel *, bool exclusive, bool intr);

+14 −21
Original line number Diff line number Diff line
@@ -11,7 +11,6 @@
#include "nouveau_exec.h"
#include "nouveau_abi16.h"
#include "nouveau_sched.h"
#include "nouveau_chan.h"

#define NOUVEAU_SCHED_JOB_TIMEOUT_MS		10000

@@ -122,9 +121,11 @@ nouveau_job_done(struct nouveau_job *job)
{
	struct nouveau_sched *sched = job->sched;

	spin_lock(&sched->job_list.lock);
	spin_lock(&sched->job.list.lock);
	list_del(&job->entry);
	spin_unlock(&sched->job_list.lock);
	spin_unlock(&sched->job.list.lock);

	wake_up(&sched->job.wq);
}

void
@@ -305,9 +306,9 @@ nouveau_job_submit(struct nouveau_job *job)
	}

	/* Submit was successful; add the job to the schedulers job list. */
	spin_lock(&sched->job_list.lock);
	list_add(&job->entry, &sched->job_list.head);
	spin_unlock(&sched->job_list.lock);
	spin_lock(&sched->job.list.lock);
	list_add(&job->entry, &sched->job.list.head);
	spin_unlock(&sched->job.list.lock);

	drm_sched_job_arm(&job->base);
	job->done_fence = dma_fence_get(&job->base.s_fence->finished);
@@ -392,23 +393,10 @@ nouveau_sched_free_job(struct drm_sched_job *sched_job)
	nouveau_job_fini(job);
}

static void
nouveau_sched_cancel_job(struct drm_sched_job *sched_job)
{
	struct nouveau_fence *fence;
	struct nouveau_job *job;

	job = to_nouveau_job(sched_job);
	fence = to_nouveau_fence(job->done_fence);

	nouveau_fence_cancel(fence);
}

static const struct drm_sched_backend_ops nouveau_sched_ops = {
	.run_job = nouveau_sched_run_job,
	.timedout_job = nouveau_sched_timedout_job,
	.free_job = nouveau_sched_free_job,
	.cancel_job = nouveau_sched_cancel_job,
};

static int
@@ -458,8 +446,9 @@ nouveau_sched_init(struct nouveau_sched *sched, struct nouveau_drm *drm,
		goto fail_sched;

	mutex_init(&sched->mutex);
	spin_lock_init(&sched->job_list.lock);
	INIT_LIST_HEAD(&sched->job_list.head);
	spin_lock_init(&sched->job.list.lock);
	INIT_LIST_HEAD(&sched->job.list.head);
	init_waitqueue_head(&sched->job.wq);

	return 0;

@@ -493,12 +482,16 @@ nouveau_sched_create(struct nouveau_sched **psched, struct nouveau_drm *drm,
	return 0;
}


static void
nouveau_sched_fini(struct nouveau_sched *sched)
{
	struct drm_gpu_scheduler *drm_sched = &sched->base;
	struct drm_sched_entity *entity = &sched->entity;

	rmb(); /* for list_empty to work without lock */
	wait_event(sched->job.wq, list_empty(&sched->job.list.head));

	drm_sched_entity_fini(entity);
	drm_sched_fini(drm_sched);

+6 −3
Original line number Diff line number Diff line
@@ -102,10 +102,13 @@ struct nouveau_sched {
	struct workqueue_struct *wq;
	struct mutex mutex;

	struct {
		struct {
			struct list_head head;
			spinlock_t lock;
	} job_list;
		} list;
		struct wait_queue_head wq;
	} job;
};

int nouveau_sched_create(struct nouveau_sched **psched, struct nouveau_drm *drm,
Loading