OpenCloudOS-Kernel/drivers/gpu/drm/i915/selftests
Chris Wilson 09a4c02e58 drm/i915: Look for an active kernel context before switching
We were not very carefully checking to see if an older request on the
engine was an earlier switch-to-kernel-context before deciding to emit a
new switch. The end result would be that we could get into a permanent
loop of trying to emit a new request to perform the switch simply to
flush the existing switch.

What we need is a means of tracking the completion of each timeline
versus the kernel context, that is to detect if a more recent request
has been submitted that would result in a switch away from the kernel
context. To realise this, we need only to look in our syncmap on the
kernel context and check that we have synchronized against all active
rings.

v2: Since all ringbuffer clients currently share the same timeline, we do
have to use the gem_context to distinguish clients.

As a bonus, include all the tracing used to debug the death inside
suspend.

v3: Test, test, test. Construct a selftest to exercise and assert the
expected behaviour that multiple switch-to-contexts do not emit
redundant requests.

Reported-by: Mika Kuoppala <mika.kuoppala@intel.com>
Fixes: a89d1f921c ("drm/i915: Split i915_gem_timeline into individual timelines")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180524081135.15278-1-chris@chris-wilson.co.uk
2018-05-24 15:51:45 +01:00
..
huge_gem_object.c drm: move read_domains and write_domain into i915 2018-02-16 14:12:48 +00:00
huge_gem_object.h
huge_pages.c drm/i915/selftests: scrub 64K 2018-05-13 10:29:18 +01:00
i915_gem_coherency.c drm/i915: Rename drm_i915_gem_request to i915_request 2018-02-21 20:57:22 +00:00
i915_gem_context.c drm/i915: Look for an active kernel context before switching 2018-05-24 15:51:45 +01:00
i915_gem_dmabuf.c drm/i915: Fix an error checking test 2017-06-27 14:30:56 +01:00
i915_gem_evict.c drm/i915: Rename drm_i915_gem_request to i915_request 2018-02-21 20:57:22 +00:00
i915_gem_gtt.c drm: move read_domains and write_domain into i915 2018-02-16 14:12:48 +00:00
i915_gem_object.c drm/i915: Rename drm_i915_gem_request to i915_request 2018-02-21 20:57:22 +00:00
i915_live_selftests.h drm/i915: Check whitelist registers across resets 2018-04-14 18:36:45 +01:00
i915_mock_selftests.h drm/i915: Look for an active kernel context before switching 2018-05-24 15:51:45 +01:00
i915_random.c drm/i915/selftests: Allow random array allocation to fail 2018-01-02 15:30:40 +00:00
i915_random.h drm/i915/selftests: Use mul_u32_u32() for 32b x 32b -> 64b result 2017-09-13 13:27:20 +01:00
i915_request.c drm/i915: Rename drm_i915_gem_request to i915_request 2018-02-21 20:57:22 +00:00
i915_selftest.c
i915_sw_fence.c drm/i915/selftests: Wait for the dma-fence timeout 2018-01-17 17:09:59 +00:00
i915_syncmap.c drm/i915/selftests: Always initialise err 2017-11-14 23:50:49 +00:00
i915_timeline.c drm/i915: Split i915_gem_timeline into individual timelines 2018-05-02 23:57:18 +01:00
i915_vma.c drm/i915/selftests: fix spelling mistake: "parmaters" -> "parameters" 2018-05-04 07:26:56 +01:00
igt_flush_test.c drm/i915/selftests: Only switch to kernel context when locked 2018-05-09 09:28:45 +01:00
igt_flush_test.h drm/i915/selftests: Refactor common flush_test() 2018-05-08 12:44:31 +01:00
intel_breadcrumbs.c drm/i915/selftests: Fix error checking for wait_var_timeout 2018-05-02 11:20:05 +01:00
intel_engine_cs.c drm/i915: add a selftest for the mmio_bases table 2018-03-15 08:46:06 +00:00
intel_guc.c drm/i915/guc: Allow preempt-client to be NULL 2018-02-08 07:29:59 +00:00
intel_hangcheck.c drm/i915/selftests: Wait longer for the old active request 2018-05-19 12:50:59 +01:00
intel_lrc.c drm/i915: Move request->ctx aside 2018-05-18 09:35:17 +01:00
intel_uncore.c drm/i915/icl: Gen11 forcewake support 2018-03-07 15:07:45 +02:00
intel_workarounds.c drm/i915/selftests: Fix uninitialized variable 2018-04-24 16:44:25 +01:00
lib_sw_fence.c drm/i915/selftests: Convert timers to use timer_setup() 2017-11-21 15:46:44 -08:00
lib_sw_fence.h drm/i915/selftests: Wrap a timer into a i915_sw_fence 2017-10-12 21:06:26 +01:00
mock_context.c drm/i915: Store a pointer to intel_context in i915_request 2018-05-18 09:35:22 +01:00
mock_context.h drm/i915/selftests: Use a sacrificial context for hang testing 2018-02-05 15:27:24 +00:00
mock_dmabuf.c
mock_dmabuf.h
mock_drm.c
mock_drm.h
mock_engine.c drm/i915/selftests: Pin the mock kernel context 2018-05-23 17:48:46 +01:00
mock_engine.h drm/i915: Supply the engine-id for our mock_engine() 2017-08-10 12:18:35 +01:00
mock_gem_device.c drm/i915/selftests: Pin the mock kernel context 2018-05-23 17:48:46 +01:00
mock_gem_device.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mock_gem_object.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mock_gtt.c drm/i915: Move timeline from GTT to ring 2018-05-02 23:57:13 +01:00
mock_gtt.h
mock_request.c drm/i915: Rename drm_i915_gem_request to i915_request 2018-02-21 20:57:22 +00:00
mock_request.h drm/i915: Rename drm_i915_gem_request to i915_request 2018-02-21 20:57:22 +00:00
mock_timeline.c drm/i915: Split i915_gem_timeline into individual timelines 2018-05-02 23:57:18 +01:00
mock_timeline.h drm/i915: Split i915_gem_timeline into individual timelines 2018-05-02 23:57:18 +01:00
mock_uncore.c
mock_uncore.h
scatterlist.c drm/i915/selftests: mix huge pages 2017-10-07 10:12:03 +01:00