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

Configure Feed

Select the types of activity you want to include in your feed.

drm/sched/tests: Implement cancel_job() callback

The GPU Scheduler now supports a new callback, cancel_job(), which lets
the scheduler cancel all jobs which might not yet be freed when
drm_sched_fini() runs. Using this callback allows for significantly
simplifying the mock scheduler teardown code.

Implement the cancel_job() callback and adjust the code where necessary.

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Signed-off-by: Philipp Stanner <phasta@kernel.org>
Link: https://lore.kernel.org/r/20250710125412.128476-5-phasta@kernel.org

+25 -44
+25 -43
drivers/gpu/drm/scheduler/tests/mock_scheduler.c
··· 63 63 lockdep_assert_held(&sched->lock); 64 64 65 65 job->flags |= DRM_MOCK_SCHED_JOB_DONE; 66 - list_move_tail(&job->link, &sched->done_list); 66 + list_del(&job->link); 67 67 dma_fence_signal_locked(&job->hw_fence); 68 68 complete(&job->done); 69 69 } ··· 236 236 237 237 static void mock_sched_free_job(struct drm_sched_job *sched_job) 238 238 { 239 - struct drm_mock_scheduler *sched = 240 - drm_sched_to_mock_sched(sched_job->sched); 241 239 struct drm_mock_sched_job *job = drm_sched_job_to_mock_job(sched_job); 242 - unsigned long flags; 243 240 244 - /* Remove from the scheduler done list. */ 245 - spin_lock_irqsave(&sched->lock, flags); 246 - list_del(&job->link); 247 - spin_unlock_irqrestore(&sched->lock, flags); 248 241 dma_fence_put(&job->hw_fence); 249 - 250 242 drm_sched_job_cleanup(sched_job); 251 243 252 244 /* Mock job itself is freed by the kunit framework. */ 253 245 } 254 246 247 + static void mock_sched_cancel_job(struct drm_sched_job *sched_job) 248 + { 249 + struct drm_mock_scheduler *sched = drm_sched_to_mock_sched(sched_job->sched); 250 + struct drm_mock_sched_job *job = drm_sched_job_to_mock_job(sched_job); 251 + unsigned long flags; 252 + 253 + hrtimer_cancel(&job->timer); 254 + 255 + spin_lock_irqsave(&sched->lock, flags); 256 + if (!dma_fence_is_signaled_locked(&job->hw_fence)) { 257 + list_del(&job->link); 258 + dma_fence_set_error(&job->hw_fence, -ECANCELED); 259 + dma_fence_signal_locked(&job->hw_fence); 260 + } 261 + spin_unlock_irqrestore(&sched->lock, flags); 262 + 263 + /* 264 + * The GPU Scheduler will call drm_sched_backend_ops.free_job(), still. 265 + * Mock job itself is freed by the kunit framework. 266 + */ 267 + } 268 + 255 269 static const struct drm_sched_backend_ops drm_mock_scheduler_ops = { 256 270 .run_job = mock_sched_run_job, 257 271 .timedout_job = mock_sched_timedout_job, 258 - .free_job = mock_sched_free_job 272 + .free_job = mock_sched_free_job, 273 + .cancel_job = mock_sched_cancel_job, 259 274 }; 260 275 261 276 /** ··· 304 289 sched->hw_timeline.context = dma_fence_context_alloc(1); 305 290 atomic_set(&sched->hw_timeline.next_seqno, 0); 306 291 INIT_LIST_HEAD(&sched->job_list); 307 - INIT_LIST_HEAD(&sched->done_list); 308 292 spin_lock_init(&sched->lock); 309 293 310 294 return sched; ··· 318 304 */ 319 305 void drm_mock_sched_fini(struct drm_mock_scheduler *sched) 320 306 { 321 - struct drm_mock_sched_job *job, *next; 322 - unsigned long flags; 323 - LIST_HEAD(list); 324 - 325 - drm_sched_wqueue_stop(&sched->base); 326 - 327 - /* Force complete all unfinished jobs. */ 328 - spin_lock_irqsave(&sched->lock, flags); 329 - list_for_each_entry_safe(job, next, &sched->job_list, link) 330 - list_move_tail(&job->link, &list); 331 - spin_unlock_irqrestore(&sched->lock, flags); 332 - 333 - list_for_each_entry(job, &list, link) 334 - hrtimer_cancel(&job->timer); 335 - 336 - spin_lock_irqsave(&sched->lock, flags); 337 - list_for_each_entry_safe(job, next, &list, link) 338 - drm_mock_sched_job_complete(job); 339 - spin_unlock_irqrestore(&sched->lock, flags); 340 - 341 - /* 342 - * Free completed jobs and jobs not yet processed by the DRM scheduler 343 - * free worker. 344 - */ 345 - spin_lock_irqsave(&sched->lock, flags); 346 - list_for_each_entry_safe(job, next, &sched->done_list, link) 347 - list_move_tail(&job->link, &list); 348 - spin_unlock_irqrestore(&sched->lock, flags); 349 - 350 - list_for_each_entry_safe(job, next, &list, link) 351 - mock_sched_free_job(&job->base); 352 - 353 307 drm_sched_fini(&sched->base); 354 308 } 355 309
-1
drivers/gpu/drm/scheduler/tests/sched_tests.h
··· 49 49 50 50 spinlock_t lock; 51 51 struct list_head job_list; 52 - struct list_head done_list; 53 52 54 53 struct { 55 54 u64 context;