]> www.infradead.org Git - users/hch/misc.git/commitdiff
drm/sched: Fix a race in DRM_GPU_SCHED_STAT_NO_HANG test
authorTvrtko Ursulin <tvrtko.ursulin@igalia.com>
Wed, 16 Jul 2025 08:48:17 +0000 (09:48 +0100)
committerPhilipp Stanner <phasta@kernel.org>
Thu, 17 Jul 2025 09:39:19 +0000 (11:39 +0200)
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: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Fixes: 1472e7549f84 ("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: Maíra Canal <mcanal@igalia.com>
Signed-off-by: Philipp Stanner <phasta@kernel.org>
Link: https://lore.kernel.org/r/20250716084817.56797-1-tvrtko.ursulin@igalia.com
drivers/gpu/drm/scheduler/tests/mock_scheduler.c
drivers/gpu/drm/scheduler/tests/sched_tests.h
drivers/gpu/drm/scheduler/tests/tests_basic.c

index 65acffc3fea828ee15fbb4764bd4bf1afa97e8fd..8e9ae7d980eb2e0534eca12f9a1803b62d0dcfae 100644 (file)
@@ -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;
        }
 
index 63d4f2ac707497541abf4d4c6aa14f94dafc459b..5b262126b7760f1da2cf98a33cd9ede92b0f0264 100644 (file)
@@ -95,9 +95,10 @@ struct drm_mock_sched_job {
 
        struct completion       done;
 
-#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_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;
index 55eb142bd7c5dfd8fdbbedc41353bdc155d3b79b..82a41a456b0a85b0af67f9c5b5e2e5c51d347aa8 100644 (file)
@@ -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);