From: John Harrison <john.c.harri...@intel.com> The driver tracks GPU work using request structures. Unfortunately, this tracking is not currently explicit but is done by means of a catch-all request that floats around in the background hoovering up work until it gets submitted. This background request (ring->outstanding_lazy_request or OLR) is created at the point of actually writing to the ring rather than when a particular piece of GPU work is started. This scheme sort of hangs together but causes a number of issues. It can mean that multiple pieces of independent work are lumped together in the same request or that work is not officially submitted until much later than it was created.
This patch series completely removes the OLR and explicitly tracks each piece of work with it's own personal request structure from start to submission. The patch set seems to fix the "'gem_ringfill --r render' + ctrl-c straight after boot" issue logged as BZ:40112. I haven't done any analysis of that particular issue but the descriptions I've seen appear to blame an inconsistent or mangled OLR. Note also that by the end of this series, a number of differences between the legacy and execlist code paths have been removed. For example add_request() and emit_request() now have the same signature thus could be merged back to a single function pointer. Merging some of these together would also allow the removal of a bunch of 'if(execlists)' tests where the difference is simply to call the legacy function or the execlist one. [Patches against drm-intel-nightly tree fetched 03/02/2015] John Harrison (51): drm/i915: Rename 'flags' to 'dispatch_flags' for better code reading drm/i915: Add missing trace point to LRC execbuff code path drm/i915: Cache ringbuf pointer in request structure drm/i915: Merged the many do_execbuf() parameters into a structure drm/i915: Add return code check to i915_gem_execbuffer_retire_commands() drm/i915: Wrap request allocation with a function pointer drm/i915: Early alloc request in execbuff drm/i915: Update alloc_request to return the allocated request drm/i915: Add request to execbuf params and add explicit cleanup drm/i915: Update the dispatch tracepoint to use params->request drm/i915: Update move_to_gpu() to take a request structure drm/i915: Update execbuffer_move_to_active() to take a request structure drm/i915: Add flag to i915_add_request() to skip the cache flush drm/i915: Update pin_to_display_plane() to do explicit request management drm/i915: Update i915_gem_object_sync() to take a request structure drm/i915: Update i915_gpu_idle() to manage its own request drm/i915: Split i915_ppgtt_init_hw() in half - generic and per ring drm/i915: Moved the for_each_ring loop outside of i915_gem_context_enable() drm/i915: Add explicit request management to i915_gem_init_hw() drm/i915: Update ppgtt_init_ring() & context_enable() to take requests drm/i915: Set context in request from creation even in legacy mode drm/i915: Update i915_switch_context() to take a request structure drm/i915: Update do_switch() to take a request structure drm/i915: Update deferred context creation to do explicit request management drm/i915: Update init_context() to take a request structure drm/i915: Update render_state_init() to take a request structure drm/i915: Update overlay code to do explicit request management drm/i915: Update queue_flip() to do explicit request management drm/i915: Update add_request() to take a request structure drm/i915: Update [vma|object]_move_to_active() to take request structures drm/i915: Update l3_remap to take a request structure drm/i915: Update mi_set_context() to take a request structure drm/i915: Update a bunch of execbuffer heplers to take request structures drm/i915: Update workarounds_emit() to take request structures drm/i915: Update flush_all_caches() to take request structures drm/i915: Update switch_mm() to take a request structure drm/i915: Update ring->flush() to take a requests structure drm/i915: Update some flush helpers to take request structures drm/i915: Update ring->emit_flush() to take a request structure drm/i915: Update ring->add_request() to take a request structure drm/i915: Update ring->emit_request() to take a request structure drm/i915: Update ring->dispatch_execbuffer() to take a request structure drm/i915: Update ring->emit_bb_start() to take a request structure drm/i915: Update ring->sync_to() to take a request structure drm/i915: Update ring->signal() to take a request structure drm/i915: Update cacheline_align() to take a request structure drm/i915: Update ironlake_enable_rc6() to do explicit request management drm/i915: Update intel_ring_begin() to take a request structure drm/i915: Update intel_logical_ring_begin() to take a request structure drm/i915: Remove the now obsolete intel_ring_get_request() drm/i915: Remove the now obsolete 'outstanding_lazy_request' drivers/gpu/drm/i915/i915_drv.h | 68 +++--- drivers/gpu/drm/i915/i915_gem.c | 207 +++++++++++-------- drivers/gpu/drm/i915/i915_gem_context.c | 76 +++---- drivers/gpu/drm/i915/i915_gem_execbuffer.c | 138 ++++++++----- drivers/gpu/drm/i915/i915_gem_gtt.c | 55 ++--- drivers/gpu/drm/i915/i915_gem_gtt.h | 3 +- drivers/gpu/drm/i915/i915_gem_render_state.c | 16 +- drivers/gpu/drm/i915/i915_gem_render_state.h | 2 +- drivers/gpu/drm/i915/intel_display.c | 61 +++--- drivers/gpu/drm/i915/intel_lrc.c | 186 +++++++++-------- drivers/gpu/drm/i915/intel_lrc.h | 20 +- drivers/gpu/drm/i915/intel_overlay.c | 64 ++++-- drivers/gpu/drm/i915/intel_pm.c | 33 ++- drivers/gpu/drm/i915/intel_ringbuffer.c | 287 ++++++++++++++------------ drivers/gpu/drm/i915/intel_ringbuffer.h | 51 ++--- 15 files changed, 697 insertions(+), 570 deletions(-) -- 1.7.9.5 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx