linux/drivers/gpu/drm/i915
Chris Wilson df9f85d858 drm/i915: Serialise i915_active_fence_set() with itself
The expected downside to commit 58b4c1a07a ("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: 58b4c1a07a ("drm/i915: Reduce nested prepare_remote_context() to a trylock")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191127134527.3438410-1-chris@chris-wilson.co.uk
2019-11-27 17:02:14 +00:00
..
display drm/i915/dp: fix DP audio for PORT_A on gen12+ 2019-11-26 16:12:44 -08:00
gem drm/i915: Serialise with engine-pm around requests on the kernel_context 2019-11-25 13:17:18 +00:00
gt drm/i915: Serialise i915_active_fence_set() with itself 2019-11-27 17:02:14 +00:00
gvt drm/i915: make more headers self-contained 2019-11-08 10:16:13 +00:00
oa drm/i915/tgl: Add perf support on TGL 2019-10-29 12:53:54 +02:00
selftests drm/i915/selftests: Move mock_vma to the heap to reduce stack_frame 2019-11-25 15:09:14 +00:00
i915_active_types.h drm/i915: Serialise i915_active_fence_set() with itself 2019-11-27 17:02:14 +00:00
i915_active.c drm/i915: Serialise i915_active_fence_set() with itself 2019-11-27 17:02:14 +00:00
i915_active.h drm/i915: Serialise i915_active_fence_set() with itself 2019-11-27 17:02:14 +00:00
i915_buddy.c
i915_buddy.h
i915_cmd_parser.c drm/i915/cmdparser: Fix jump whitelist clearing 2019-11-11 08:13:49 -08:00
i915_debugfs.c drm/i915: Perform automated conversions for crtc uapi/hw split, base -> uapi. 2019-11-01 14:51:21 +01:00
i915_debugfs.h
i915_drv.c Skip MCHBAR queries when display is not available 2019-11-20 17:43:47 +02:00
i915_drv.h drm/i915: Support more QGV points 2019-11-26 18:27:37 +02:00
i915_fixed.h
i915_gem_evict.c drm/i915: Move request runtime management onto gt 2019-10-04 15:39:26 +01:00
i915_gem_fence_reg.c drm/i915: set num_fence_regs to 0 if there is no aperture 2019-10-29 10:35:47 +00:00
i915_gem_fence_reg.h drm/i915: Store i915_ggtt as the backpointer on fence registers 2019-10-16 19:41:36 +01:00
i915_gem_gtt.c drm/i915: Leave the aliasing-ppgtt size alone 2019-11-11 10:30:02 +02:00
i915_gem_gtt.h drm/i915: define i915_ggtt_has_aperture 2019-10-29 10:31:40 +00:00
i915_gem.c drm/i915: Serialise with remote retirement 2019-11-21 11:53:55 +00:00
i915_gem.h drm/i915/gem: Manually dump the debug trace on GEM_BUG_ON 2019-11-19 17:44:39 +00:00
i915_getparam.c Backmerge i915 security patches from commit 'ea0b163b13ff' into drm-next 2019-11-14 11:09:06 +10:00
i915_globals.c
i915_globals.h
i915_gpu_error.c drm/i915: Switch kunmap() to take the page not vaddr 2019-11-25 09:24:31 +00:00
i915_gpu_error.h drm/i915/tgl: Add gam instdone 2019-10-30 09:15:27 +00:00
i915_ioc32.c
i915_irq.c drm/i915: Disable display interrupts during display IRQ handler 2019-11-26 16:56:57 -08:00
i915_irq.h drm/i915: Extract the GuC interrupt handlers 2019-10-26 19:28:59 +01:00
i915_memcpy.c
i915_memcpy.h
i915_mm.c
i915_params.c drm/i915/lmem: add the fake lmem region 2019-10-31 20:41:47 +00:00
i915_params.h drm/i915/lmem: add the fake lmem region 2019-10-31 20:41:47 +00:00
i915_pci.c drm/i915/selftests: Perform some basic cycle counting of MI ops 2019-11-11 18:30:13 +00:00
i915_perf_types.h drm/i915/perf: Describe structure members in documentation 2019-10-24 15:01:35 +01:00
i915_perf.c drm/i915: Serialise with engine-pm around requests on the kernel_context 2019-11-25 13:17:18 +00:00
i915_perf.h drm/i915/perf: introduce a versioning of the i915-perf uapi 2019-10-14 21:30:25 +01:00
i915_pmu.c drm/i915: Mark up the calling context for intel_wakeref_put() 2019-11-20 15:59:23 +00:00
i915_pmu.h drm/i915/pmu: Support multiple GPUs 2019-10-17 10:50:47 +01:00
i915_priolist_types.h drm/i915/gt: Replace hangcheck by heartbeats 2019-10-23 23:52:10 +01:00
i915_pvinfo.h
i915_query.c drm/i915/query: Align flavour of engine data lookup 2019-11-23 19:33:12 +00:00
i915_query.h
i915_reg.h drm/i915: Fix frame start delay programming 2019-11-15 20:35:04 +02:00
i915_request.c drm/i915: Use a ctor for TYPESAFE_BY_RCU i915_request 2019-11-22 10:47:38 +00:00
i915_request.h drm/i915: Mark up "sentinel" requests 2019-10-12 08:51:17 +01:00
i915_scatterlist.c
i915_scatterlist.h
i915_scheduler_types.h drm/i915: Note the addition of timeslicing to the pretend scheduler 2019-10-11 09:36:16 +01:00
i915_scheduler.c drm/i915: Use a ctor for TYPESAFE_BY_RCU i915_request 2019-11-22 10:47:38 +00:00
i915_scheduler.h drm/i915: Use a ctor for TYPESAFE_BY_RCU i915_request 2019-11-22 10:47:38 +00:00
i915_selftest.h drm/i915/selftests: Perform some basic cycle counting of MI ops 2019-11-11 18:30:13 +00:00
i915_suspend.c drm/i915: Drop struct_mutex from suspend state save/restore 2019-10-04 15:39:41 +01:00
i915_suspend.h
i915_sw_fence_work.c
i915_sw_fence_work.h
i915_sw_fence.c drm/i915: Use a ctor for TYPESAFE_BY_RCU i915_request 2019-11-22 10:47:38 +00:00
i915_sw_fence.h drm/i915: Use a ctor for TYPESAFE_BY_RCU i915_request 2019-11-22 10:47:38 +00:00
i915_switcheroo.c drm/i915: split out i915_switcheroo.[ch] from i915_drv.c 2019-10-06 11:25:00 +03:00
i915_switcheroo.h drm/i915: split out i915_switcheroo.[ch] from i915_drv.c 2019-10-06 11:25:00 +03:00
i915_syncmap.c
i915_syncmap.h
i915_sysfs.c drm/i915: Extract GT render power state management 2019-10-26 19:28:59 +01:00
i915_sysfs.h
i915_trace_points.c
i915_trace.h drm/i915: Move context management under GEM 2019-10-04 15:39:34 +01:00
i915_user_extensions.c
i915_user_extensions.h
i915_utils.c drm/i915: Rename "inject_load_failure" module parameter 2019-10-29 15:37:57 +00:00
i915_utils.h drm/i915: Fix i915_inject_load_error() name to read *_probe_* 2019-10-29 15:37:57 +00:00
i915_vgpu.c
i915_vgpu.h
i915_vma.c drm/i915: Split detaching and removing the vma 2019-10-31 14:52:19 +00:00
i915_vma.h drm/i915: Lift i915_vma_parked() onto the gt 2019-10-21 21:07:56 +01:00
intel_csr.c drm/i915/dmc: Update ICL DMC version to v1.09 2019-09-27 10:20:39 -07:00
intel_csr.h
intel_device_info.c drm/i915/display/cnl+: Handle fused off DSC 2019-10-29 12:12:49 -07:00
intel_device_info.h drm/i915/display/cnl+: Handle fused off DSC 2019-10-29 12:12:49 -07:00
intel_gvt.c
intel_gvt.h
intel_memory_region.c drm/i915/lmem: add the fake lmem region 2019-10-31 20:41:47 +00:00
intel_memory_region.h drm/i915/lmem: add the fake lmem region 2019-10-31 20:41:47 +00:00
intel_pch.c drm/i915: Fix detection for a CMP-V PCH 2019-11-13 14:03:15 +02:00
intel_pch.h drm/i915: Fix detection for a CMP-V PCH 2019-11-13 14:03:15 +02:00
intel_pm.c drm/i915: Change watermark hook calling convention 2019-11-20 17:43:47 +02:00
intel_pm.h drm/i915/gen8+: Add RC6 CTX corruption WA 2019-11-05 11:43:07 -08:00
intel_region_lmem.c drm/i915/lmem: fixup fake lmem teardown 2019-11-06 14:34:10 +00:00
intel_region_lmem.h drm/i915/lmem: add the fake lmem region 2019-10-31 20:41:47 +00:00
intel_runtime_pm.c drm/i915/display: abstract all vgaarb access to intel_vga.[ch] 2019-10-02 13:31:54 +03:00
intel_runtime_pm.h
intel_sideband.c
intel_sideband.h
intel_uncore.c
intel_uncore.h
intel_wakeref.c drm/i915: Mark up the calling context for intel_wakeref_put() 2019-11-20 15:59:23 +00:00
intel_wakeref.h drm/i915: Mark intel_wakeref_get() as a sleeper 2019-11-21 13:22:04 +00:00
intel_wopcm.c
intel_wopcm.h
Kconfig drm/i915: Put future HW and their uAPIs under STAGING & BROKEN 2019-10-27 15:47:10 +00:00
Kconfig.debug Merge drm/drm-next into drm-intel-next-queued 2019-11-15 13:17:39 +02:00
Kconfig.profile drm/i915: Default to a more lenient forced preemption timeout 2019-11-26 09:38:44 +00:00
Kconfig.unstable drm/i915/lmem: add the fake lmem region 2019-10-31 20:41:47 +00:00
Makefile drm/i915/selftests: Wrap vm_mmap() around GEM objects 2019-11-07 21:22:58 +00:00