1. 03 12月, 2020 1 次提交
    • C
      drm/i915/gt: Protect context lifetime with RCU · 9261a1db
      Chris Wilson 提交于
      Allow a brief period for continued access to a dead intel_context by
      deferring the release of the struct until after an RCU grace period.
      As we are using a dedicated slab cache for the contexts, we can defer
      the release of the slab pages via RCU, with the caveat that individual
      structs may be reused from the freelist within an RCU grace period. To
      handle that, we have to avoid clearing members of the zombie struct.
      
      This is required for a later patch to handle locking around virtual
      requests in the signaler, as those requests may want to move between
      engines and be destroyed while we are holding b->irq_lock on a physical
      engine.
      
      v2: Drop mutex_reinit(), if we never mark the mutex as destroyed we
      don't need to reset the debug code, at the loss of having the mutex
      debug code spot us attempting to destroy a locked mutex.
      v3: As the intended use will remain strongly referenced counted, with
      very little inflight access across reuse, drop the ctor.
      v4: Drop the unrequired change to remove the temporary reference around
      dropping the active context, and add back some more missing ctor
      operations.
      v5: The ctor is back. Tvrtko spotted that ce->signal_lock [introduced
      later] maybe accessed under RCU and so needs special care not to be
      reinitialised.
      v6: Don't mix SLAB_TYPESAFE_BY_RCU and RCU list iteration.
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20201126140407.31952-3-chris@chris-wilson.co.uk
      (cherry picked from commit 14d1eaf0)
      Signed-off-by: NRodrigo Vivi <rodrigo.vivi@intel.com>
      9261a1db
  2. 01 10月, 2020 1 次提交
  3. 07 9月, 2020 5 次提交
  4. 08 7月, 2020 1 次提交
  5. 07 7月, 2020 1 次提交
  6. 25 5月, 2020 1 次提交
  7. 20 5月, 2020 1 次提交
  8. 27 3月, 2020 1 次提交
  9. 24 3月, 2020 1 次提交
  10. 23 3月, 2020 1 次提交
  11. 22 3月, 2020 1 次提交
  12. 20 3月, 2020 2 次提交
  13. 04 3月, 2020 1 次提交
  14. 16 2月, 2020 1 次提交
  15. 13 2月, 2020 1 次提交
  16. 12 2月, 2020 1 次提交
    • C
      drm/i915/gt: Acquire ce->active before ce->pin_count/ce->pin_mutex · 5b92415e
      Chris Wilson 提交于
      Similar to commit ac0e331a ("drm/i915: Tighten atomicity of
      i915_active_acquire vs i915_active_release") we have the same race of
      trying to pin the context underneath a mutex while allowing the
      decrement to be atomic outside of that mutex. This leads to the problem
      where two threads may simultaneously try to pin the context and the
      second not notice that they needed to repin the context.
      
      <2> [198.669621] kernel BUG at drivers/gpu/drm/i915/gt/intel_timeline.c:387!
      <4> [198.669703] invalid opcode: 0000 [#1] PREEMPT SMP PTI
      <4> [198.669712] CPU: 0 PID: 1246 Comm: gem_exec_create Tainted: G     U  W         5.5.0-rc6-CI-CI_DRM_7755+ #1
      <4> [198.669723] Hardware name:  /NUC7i5BNB, BIOS BNKBL357.86A.0054.2017.1025.1822 10/25/2017
      <4> [198.669776] RIP: 0010:timeline_advance+0x7b/0xe0 [i915]
      <4> [198.669785] Code: 00 48 c7 c2 10 f1 46 a0 48 c7 c7 70 1b 32 a0 e8 bb dd e7 e0 bf 01 00 00 00 e8 d1 af e7 e0 31 f6 bf 09 00 00 00 e8 35 ef d8 e0 <0f> 0b 48 c7 c1 48 fa 49 a0 ba 84 01 00 00 48 c7 c6 10 f1 46 a0 48
      <4> [198.669803] RSP: 0018:ffffc900004c3a38 EFLAGS: 00010296
      <4> [198.669810] RAX: ffff888270b35140 RBX: ffff88826f32ee00 RCX: 0000000000000006
      <4> [198.669818] RDX: 00000000000017c5 RSI: 0000000000000000 RDI: 0000000000000009
      <4> [198.669826] RBP: ffffc900004c3a64 R08: 0000000000000000 R09: 0000000000000000
      <4> [198.669834] R10: 0000000000000000 R11: 0000000000000000 R12: ffff88826f9b5980
      <4> [198.669841] R13: 0000000000000cc0 R14: ffffc900004c3dc0 R15: ffff888253610068
      <4> [198.669849] FS:  00007f63e663fe40(0000) GS:ffff888276c00000(0000) knlGS:0000000000000000
      <4> [198.669857] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      <4> [198.669864] CR2: 00007f171f8e39a8 CR3: 000000026b1f6005 CR4: 00000000003606f0
      <4> [198.669872] Call Trace:
      <4> [198.669924]  intel_timeline_get_seqno+0x12/0x40 [i915]
      <4> [198.669977]  __i915_request_create+0x76/0x5a0 [i915]
      <4> [198.670024]  i915_request_create+0x86/0x1c0 [i915]
      <4> [198.670068]  i915_gem_do_execbuffer+0xbf2/0x2500 [i915]
      <4> [198.670082]  ? __lock_acquire+0x460/0x15d0
      <4> [198.670128]  i915_gem_execbuffer2_ioctl+0x11f/0x470 [i915]
      <4> [198.670171]  ? i915_gem_execbuffer_ioctl+0x300/0x300 [i915]
      <4> [198.670181]  drm_ioctl_kernel+0xa7/0xf0
      <4> [198.670188]  drm_ioctl+0x2e1/0x390
      <4> [198.670233]  ? i915_gem_execbuffer_ioctl+0x300/0x300 [i915]
      
      Fixes: 84135022 ("drm/i915/gt: Drop mutex serialisation between context pin/unpin")
      References: ac0e331a ("drm/i915: Tighten atomicity of i915_active_acquire vs i915_active_release")
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200127152829.2842149-1-chris@chris-wilson.co.uk
      (cherry picked from commit e5429340)
      Signed-off-by: NJani Nikula <jani.nikula@intel.com>
      5b92415e
  17. 28 1月, 2020 1 次提交
    • C
      drm/i915/gt: Acquire ce->active before ce->pin_count/ce->pin_mutex · e5429340
      Chris Wilson 提交于
      Similar to commit ac0e331a ("drm/i915: Tighten atomicity of
      i915_active_acquire vs i915_active_release") we have the same race of
      trying to pin the context underneath a mutex while allowing the
      decrement to be atomic outside of that mutex. This leads to the problem
      where two threads may simultaneously try to pin the context and the
      second not notice that they needed to repin the context.
      
      <2> [198.669621] kernel BUG at drivers/gpu/drm/i915/gt/intel_timeline.c:387!
      <4> [198.669703] invalid opcode: 0000 [#1] PREEMPT SMP PTI
      <4> [198.669712] CPU: 0 PID: 1246 Comm: gem_exec_create Tainted: G     U  W         5.5.0-rc6-CI-CI_DRM_7755+ #1
      <4> [198.669723] Hardware name:  /NUC7i5BNB, BIOS BNKBL357.86A.0054.2017.1025.1822 10/25/2017
      <4> [198.669776] RIP: 0010:timeline_advance+0x7b/0xe0 [i915]
      <4> [198.669785] Code: 00 48 c7 c2 10 f1 46 a0 48 c7 c7 70 1b 32 a0 e8 bb dd e7 e0 bf 01 00 00 00 e8 d1 af e7 e0 31 f6 bf 09 00 00 00 e8 35 ef d8 e0 <0f> 0b 48 c7 c1 48 fa 49 a0 ba 84 01 00 00 48 c7 c6 10 f1 46 a0 48
      <4> [198.669803] RSP: 0018:ffffc900004c3a38 EFLAGS: 00010296
      <4> [198.669810] RAX: ffff888270b35140 RBX: ffff88826f32ee00 RCX: 0000000000000006
      <4> [198.669818] RDX: 00000000000017c5 RSI: 0000000000000000 RDI: 0000000000000009
      <4> [198.669826] RBP: ffffc900004c3a64 R08: 0000000000000000 R09: 0000000000000000
      <4> [198.669834] R10: 0000000000000000 R11: 0000000000000000 R12: ffff88826f9b5980
      <4> [198.669841] R13: 0000000000000cc0 R14: ffffc900004c3dc0 R15: ffff888253610068
      <4> [198.669849] FS:  00007f63e663fe40(0000) GS:ffff888276c00000(0000) knlGS:0000000000000000
      <4> [198.669857] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      <4> [198.669864] CR2: 00007f171f8e39a8 CR3: 000000026b1f6005 CR4: 00000000003606f0
      <4> [198.669872] Call Trace:
      <4> [198.669924]  intel_timeline_get_seqno+0x12/0x40 [i915]
      <4> [198.669977]  __i915_request_create+0x76/0x5a0 [i915]
      <4> [198.670024]  i915_request_create+0x86/0x1c0 [i915]
      <4> [198.670068]  i915_gem_do_execbuffer+0xbf2/0x2500 [i915]
      <4> [198.670082]  ? __lock_acquire+0x460/0x15d0
      <4> [198.670128]  i915_gem_execbuffer2_ioctl+0x11f/0x470 [i915]
      <4> [198.670171]  ? i915_gem_execbuffer_ioctl+0x300/0x300 [i915]
      <4> [198.670181]  drm_ioctl_kernel+0xa7/0xf0
      <4> [198.670188]  drm_ioctl+0x2e1/0x390
      <4> [198.670233]  ? i915_gem_execbuffer_ioctl+0x300/0x300 [i915]
      
      Fixes: 84135022 ("drm/i915/gt: Drop mutex serialisation between context pin/unpin")
      References: ac0e331a ("drm/i915: Tighten atomicity of i915_active_acquire vs i915_active_release")
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20200127152829.2842149-1-chris@chris-wilson.co.uk
      e5429340
  18. 13 1月, 2020 2 次提交
  19. 10 1月, 2020 2 次提交
  20. 09 1月, 2020 3 次提交
  21. 06 1月, 2020 2 次提交
  22. 22 12月, 2019 1 次提交
  23. 20 12月, 2019 2 次提交
  24. 14 12月, 2019 1 次提交
  25. 05 12月, 2019 1 次提交
  26. 04 12月, 2019 1 次提交
  27. 28 11月, 2019 1 次提交
    • C
      drm/i915: Serialise i915_active_fence_set() with itself · df9f85d8
      Chris Wilson 提交于
      The expected downside to commit 58b4c1a0 ("drm/i915: Reduce nested
      prepare_remote_context() to a trylock") was that it would need to return
      -EAGAIN to userspace in order to resolve potential mutex inversion. Such
      an unsightly round trip is unnecessary if we could atomically insert a
      barrier into the i915_active_fence, so make it happen.
      
      Currently, we use the timeline->mutex (or some other named outer lock)
      to order insertion into the i915_active_fence (and so individual nodes
      of i915_active). Inside __i915_active_fence_set, we only need then
      serialise with the interrupt handler in order to claim the timeline for
      ourselves.
      
      However, if we remove the outer lock, we need to ensure the order is
      intact between not only multiple threads trying to insert themselves
      into the timeline, but also with the interrupt handler completing the
      previous occupant. We use xchg() on insert so that we have an ordered
      sequence of insertions (and each caller knows the previous fence on
      which to wait, preserving the chain of all fences in the timeline), but
      we then have to cmpxchg() in the interrupt handler to avoid overwriting
      the new occupant. The only nasty side-effect is having to temporarily
      strip off the RCU-annotations to apply the atomic operations, otherwise
      the rules are much more conventional!
      
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112402
      Fixes: 58b4c1a0 ("drm/i915: Reduce nested prepare_remote_context() to a trylock")
      Signed-off-by: NChris Wilson <chris@chris-wilson.co.uk>
      Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
      Reviewed-by: NTvrtko Ursulin <tvrtko.ursulin@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20191127134527.3438410-1-chris@chris-wilson.co.uk
      df9f85d8
  28. 27 11月, 2019 1 次提交
  29. 26 11月, 2019 1 次提交