Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/sched: Add new test for DRM_GPU_SCHED_STAT_NO_HANG

Add a test to submit a single job against a scheduler with the timeout
configured and verify that if the job is still running, the timeout
handler will skip the reset and allow the job to complete.

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Reviewed-by: Philipp Stanner <phasta@kernel.org>
Link: https://lore.kernel.org/r/20250714-sched-skip-reset-v6-4-5c5ba4f55039@igalia.com
Signed-off-by: Maíra Canal <mcanal@igalia.com>

+49
+5
drivers/gpu/drm/scheduler/tests/mock_scheduler.c
··· 218 218 struct drm_mock_sched_job *job = drm_sched_job_to_mock_job(sched_job); 219 219 unsigned long flags; 220 220 221 + if (job->flags & DRM_MOCK_SCHED_JOB_DONT_RESET) { 222 + job->flags &= ~DRM_MOCK_SCHED_JOB_DONT_RESET; 223 + return DRM_GPU_SCHED_STAT_NO_HANG; 224 + } 225 + 221 226 spin_lock_irqsave(&sched->lock, flags); 222 227 if (!dma_fence_is_signaled_locked(&job->hw_fence)) { 223 228 list_del(&job->link);
+1
drivers/gpu/drm/scheduler/tests/sched_tests.h
··· 97 97 98 98 #define DRM_MOCK_SCHED_JOB_DONE 0x1 99 99 #define DRM_MOCK_SCHED_JOB_TIMEDOUT 0x2 100 + #define DRM_MOCK_SCHED_JOB_DONT_RESET 0x4 100 101 unsigned long flags; 101 102 102 103 struct list_head link;
+43
drivers/gpu/drm/scheduler/tests/tests_basic.c
··· 287 287 drm_mock_sched_entity_free(entity); 288 288 } 289 289 290 + static void drm_sched_skip_reset(struct kunit *test) 291 + { 292 + struct drm_mock_scheduler *sched = test->priv; 293 + struct drm_mock_sched_entity *entity; 294 + struct drm_mock_sched_job *job; 295 + unsigned int i; 296 + bool done; 297 + 298 + /* 299 + * Submit a single job against a scheduler with the timeout configured 300 + * and verify that if the job is still running, the timeout handler 301 + * will skip the reset and allow the job to complete. 302 + */ 303 + 304 + entity = drm_mock_sched_entity_new(test, 305 + DRM_SCHED_PRIORITY_NORMAL, 306 + sched); 307 + job = drm_mock_sched_job_new(test, entity); 308 + 309 + job->flags = DRM_MOCK_SCHED_JOB_DONT_RESET; 310 + 311 + drm_mock_sched_job_submit(job); 312 + 313 + done = drm_mock_sched_job_wait_scheduled(job, HZ); 314 + KUNIT_ASSERT_TRUE(test, done); 315 + 316 + done = drm_mock_sched_job_wait_finished(job, 2 * MOCK_TIMEOUT); 317 + KUNIT_ASSERT_FALSE(test, done); 318 + 319 + KUNIT_ASSERT_EQ(test, 320 + job->flags & DRM_MOCK_SCHED_JOB_DONT_RESET, 321 + 0); 322 + 323 + i = drm_mock_sched_advance(sched, 1); 324 + KUNIT_ASSERT_EQ(test, i, 1); 325 + 326 + done = drm_mock_sched_job_wait_finished(job, HZ); 327 + KUNIT_ASSERT_TRUE(test, done); 328 + 329 + drm_mock_sched_entity_free(entity); 330 + } 331 + 290 332 static struct kunit_case drm_sched_timeout_tests[] = { 291 333 KUNIT_CASE(drm_sched_basic_timeout), 334 + KUNIT_CASE(drm_sched_skip_reset), 292 335 {} 293 336 }; 294 337