[bug report] drm/i915/mtl: Add hardware-level lock for steering
Dan Carpenter
error27 at gmail.com
Wed Feb 8 14:26:36 UTC 2023
Hello Matt Roper,
The patch 3100240bf846: "drm/i915/mtl: Add hardware-level lock for
steering" from Nov 28, 2022, leads to the following Smatch static
checker warning:
drivers/gpu/drm/i915/gt/intel_gt_mcr.c:379 intel_gt_mcr_lock() warn: sleeping in atomic context
CALL TREE:
intel_engine_reset() <- disables preempt
intel_gt_handle_error() <- disables preempt
live_hold_reset() <- disables preempt
reset_virtual_engine() <- disables preempt
-> __intel_engine_reset_bh()
-> intel_engine_resume()
-> intel_engine_apply_workarounds()
-> wa_list_apply()
-> intel_gt_mcr_lock()
drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c:769 intel_guc_ct_send() warn: sleeping in atomic context
CALL TREE:
guc_submission_tasklet() <- disables preempt
-> guc_dequeue_one_context()
guc_submit_request() <- disables preempt
-> guc_bypass_tasklet_submit()
-> guc_add_request()
-> __guc_add_request() <- disables preempt
-> intel_guc_send_nb()
-> intel_guc_ct_send()
drivers/gpu/drm/i915/gt/intel_gt_mcr.c
366 void intel_gt_mcr_lock(struct intel_gt *gt, unsigned long *flags)
367 {
368 unsigned long __flags;
369 int err = 0;
370
371 lockdep_assert_not_held(>->uncore->lock);
372
373 /*
374 * Starting with MTL, we need to coordinate not only with other
375 * driver threads, but also with hardware/firmware agents. A dedicated
376 * locking register is used.
377 */
378 if (GRAPHICS_VER_FULL(gt->i915) >= IP_VER(12, 70))
--> 379 err = wait_for(intel_uncore_read_fw(gt->uncore,
380 MTL_STEER_SEMAPHORE) == 0x1, 100);
The wait_for() macro sleeps. But we can't sleep if preempt is disabled.
The code in the caller looks likes:
drivers/gpu/drm/i915/gt/selftest_execlists.c
626 err = engine_lock_reset_tasklet(engine);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
local_bh_disable() bumps the preempt_count.
627 if (err)
628 goto out;
629
630 engine->sched_engine->tasklet.callback(&engine->sched_engine->tasklet);
631 GEM_BUG_ON(execlists_active(&engine->execlists) != rq);
632
633 i915_request_get(rq);
634 execlists_hold(engine, rq);
635 GEM_BUG_ON(!i915_request_on_hold(rq));
636
637 __intel_engine_reset_bh(engine, NULL);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Sleeping.
638 GEM_BUG_ON(rq->fence.error != -EIO);
639
640 engine_unlock_reset_tasklet(engine);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
preempt enabled again.
641
642 /* Check that we do not resubmit the held request */
regards,
dan carpenter
More information about the dri-devel
mailing list