• Chris Wilson's avatar
    drm/i915: Skip signaling a signaled request · 1d9221e9
    Chris Wilson authored
    Preempt-to-busy introduces various fascinating complications in that the
    requests may complete as we are unsubmitting them from HW. As they may
    then signal after unsubmission, we may find ourselves having to cleanup
    the signaling request from within the signaling callback. This causes us
    to recurse onto the same i915_request.lock.
    
    However, if the request is already signaled (as it will be before we
    enter the signal callbacks), we know we can skip the signaling of that
    request during submission, neatly evading the spinlock recursion.
    
    unsubmit(ve.rq0) # timeslice expiration or other preemption
     -> virtual_submit_request(ve.rq0)
    dma_fence_signal(ve.rq0) # request completed before preemption ack
     -> submit_notify(ve.rq1)
       -> virtual_submit_request(ve.rq1) # sees that we have completed ve.rq0
          -> __i915_request_submit(ve.rq0)
    
    [  264.210142] BUG: spinlock recursion on CPU#2, sample_multi_tr/2093
    [  264.210150]  lock: 0xffff9efd6ac55080, .magic: dead4ead, .owner: sample_multi_tr/2093, .owner_cpu: 2
    [  264.210155] CPU: 2 PID: 2093 Comm: sample_multi_tr Tainted: G     U
    [  264.210158] Hardware name: Intel Corporation CoffeeLake Client Platform/CoffeeLake S UDIMM RVP, BIOS CNLSFWR1.R00.X212.B01.1909060036 09/06/2019
    [  264.210160] Call Trace:
    [  264.210167]  dump_stack+0x98/0xda
    [  264.210174]  spin_dump.cold+0x24/0x3c
    [  264.210178]  do_raw_spin_lock+0x9a/0xd0
    [  264.210184]  _raw_spin_lock_nested+0x6a/0x70
    [  264.210314]  __i915_request_submit+0x10a/0x3c0 [i915]
    [  264.210415]  virtual_submit_request+0x9b/0x380 [i915]
    [  264.210516]  submit_notify+0xaf/0x14c [i915]
    [  264.210602]  __i915_sw_fence_complete+0x8a/0x230 [i915]
    [  264.210692]  i915_sw_fence_complete+0x2d/0x40 [i915]
    [  264.210762]  __dma_i915_sw_fence_wake+0x19/0x30 [i915]
    [  264.210767]  dma_fence_signal_locked+0xb1/0x1c0
    [  264.210772]  dma_fence_signal+0x29/0x50
    [  264.210871]  i915_request_wait+0x5cb/0x830 [i915]
    [  264.210876]  ? dma_resv_get_fences_rcu+0x294/0x5d0
    [  264.210974]  i915_gem_object_wait_fence+0x2f/0x40 [i915]
    [  264.211084]  i915_gem_object_wait+0xce/0x400 [i915]
    [  264.211178]  i915_gem_wait_ioctl+0xff/0x290 [i915]
    
    Fixes: 22b7a426 ("drm/i915/execlists: Preempt-to-busy")
    References: 6d06779e ("drm/i915: Load balancing across a virtual engine")
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
    Cc: "Nayana, Venkata Ramana" <venkata.ramana.nayana@intel.com>
    Cc: <stable@vger.kernel.org> # v5.4+
    Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20200713141636.29326-1-chris@chris-wilson.co.uk
    1d9221e9
i915_request.c 53.9 KB