Commit 2650bc40 authored by Tvrtko Ursulin's avatar Tvrtko Ursulin Committed by Philipp Stanner
Browse files

drm/sched: Fix a race in DRM_GPU_SCHED_STAT_NO_HANG test



The "skip reset" test waits for the timeout handler to run for the
duration of 2 * MOCK_TIMEOUT, and because the mock scheduler opted to
remove the "skip reset" flag once it fires, this gives opportunity for the
timeout handler to run twice. Second time the job will be removed from the
mock scheduler job list and the drm_mock_sched_advance() call in the test
will fail.

Fix it by making the "don't reset" flag persist for the lifetime of the
job and add a new flag to verify that the code path had executed as
expected.

Signed-off-by: default avatarTvrtko Ursulin <tvrtko.ursulin@igalia.com>
Fixes: 1472e754 ("drm/sched: Add new test for DRM_GPU_SCHED_STAT_NO_HANG")
Cc: Maíra Canal <mcanal@igalia.com>
Cc: Philipp Stanner <phasta@kernel.org>
Reviewed-by: default avatarMaíra Canal <mcanal@igalia.com>
Signed-off-by: default avatarPhilipp Stanner <phasta@kernel.org>
Link: https://lore.kernel.org/r/20250716084817.56797-1-tvrtko.ursulin@igalia.com
parent 28c5c486
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -219,7 +219,7 @@ mock_sched_timedout_job(struct drm_sched_job *sched_job)
	unsigned long flags;

	if (job->flags & DRM_MOCK_SCHED_JOB_DONT_RESET) {
		job->flags &= ~DRM_MOCK_SCHED_JOB_DONT_RESET;
		job->flags |= DRM_MOCK_SCHED_JOB_RESET_SKIPPED;
		return DRM_GPU_SCHED_STAT_NO_HANG;
	}

+4 −3
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ struct drm_mock_sched_job {
#define DRM_MOCK_SCHED_JOB_DONE			0x1
#define DRM_MOCK_SCHED_JOB_TIMEDOUT		0x2
#define DRM_MOCK_SCHED_JOB_DONT_RESET		0x4
#define DRM_MOCK_SCHED_JOB_RESET_SKIPPED	0x8
	unsigned long		flags;

	struct list_head	link;
+2 −2
Original line number Diff line number Diff line
@@ -317,8 +317,8 @@ static void drm_sched_skip_reset(struct kunit *test)
	KUNIT_ASSERT_FALSE(test, done);

	KUNIT_ASSERT_EQ(test,
			job->flags & DRM_MOCK_SCHED_JOB_DONT_RESET,
			0);
			job->flags & DRM_MOCK_SCHED_JOB_RESET_SKIPPED,
			DRM_MOCK_SCHED_JOB_RESET_SKIPPED);

	i = drm_mock_sched_advance(sched, 1);
	KUNIT_ASSERT_EQ(test, i, 1);