aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_engine_cs.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2017-10-03 16:34:48 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2017-10-04 12:52:45 -0400
commite7af3116836fb7feb985497f2c7776751fb27ef3 (patch)
treea9044c9a587ee6a840d3d67cb337355f5f5f8456 /drivers/gpu/drm/i915/intel_engine_cs.c
parentd6c0511300dcff19969844495ba293c4efb50b42 (diff)
drm/i915: Introduce a preempt context
Add another perma-pinned context for using for preemption at any time. We cannot just reuse the existing kernel context, as first and foremost we need to ensure that we can preempt the kernel context itself, so require a distinct context id. Similar to the kernel context, we may want to interrupt execution and switch to the preempt context at any time, and so it needs to be permanently pinned and available. To compensate for yet another permanent allocation, we shrink the existing context and the new context by reducing their ringbuffer to the minimum. v2: Assert that we never allocate a request from the preemption context. v3: Limit perma-pin to engines that may preempt. v4: Onion cleanup for early driver death v5: Onion ordering in main driver cleanup as well. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: MichaƂ Winiarski <michal.winiarski@intel.com> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171003203453.15692-4-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm/i915/intel_engine_cs.c')
-rw-r--r--drivers/gpu/drm/i915/intel_engine_cs.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
index dd64e3d13aa9..8b8053d8e24b 100644
--- a/drivers/gpu/drm/i915/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/intel_engine_cs.c
@@ -613,9 +613,22 @@ int intel_engine_init_common(struct intel_engine_cs *engine)
613 if (IS_ERR(ring)) 613 if (IS_ERR(ring))
614 return PTR_ERR(ring); 614 return PTR_ERR(ring);
615 615
616 /*
617 * Similarly the preempt context must always be available so that
618 * we can interrupt the engine at any time.
619 */
620 if (INTEL_INFO(engine->i915)->has_logical_ring_preemption) {
621 ring = engine->context_pin(engine,
622 engine->i915->preempt_context);
623 if (IS_ERR(ring)) {
624 ret = PTR_ERR(ring);
625 goto err_unpin_kernel;
626 }
627 }
628
616 ret = intel_engine_init_breadcrumbs(engine); 629 ret = intel_engine_init_breadcrumbs(engine);
617 if (ret) 630 if (ret)
618 goto err_unpin; 631 goto err_unpin_preempt;
619 632
620 ret = i915_gem_render_state_init(engine); 633 ret = i915_gem_render_state_init(engine);
621 if (ret) 634 if (ret)
@@ -634,7 +647,10 @@ err_rs_fini:
634 i915_gem_render_state_fini(engine); 647 i915_gem_render_state_fini(engine);
635err_breadcrumbs: 648err_breadcrumbs:
636 intel_engine_fini_breadcrumbs(engine); 649 intel_engine_fini_breadcrumbs(engine);
637err_unpin: 650err_unpin_preempt:
651 if (INTEL_INFO(engine->i915)->has_logical_ring_preemption)
652 engine->context_unpin(engine, engine->i915->preempt_context);
653err_unpin_kernel:
638 engine->context_unpin(engine, engine->i915->kernel_context); 654 engine->context_unpin(engine, engine->i915->kernel_context);
639 return ret; 655 return ret;
640} 656}
@@ -660,6 +676,8 @@ void intel_engine_cleanup_common(struct intel_engine_cs *engine)
660 intel_engine_cleanup_cmd_parser(engine); 676 intel_engine_cleanup_cmd_parser(engine);
661 i915_gem_batch_pool_fini(&engine->batch_pool); 677 i915_gem_batch_pool_fini(&engine->batch_pool);
662 678
679 if (INTEL_INFO(engine->i915)->has_logical_ring_preemption)
680 engine->context_unpin(engine, engine->i915->preempt_context);
663 engine->context_unpin(engine, engine->i915->kernel_context); 681 engine->context_unpin(engine, engine->i915->kernel_context);
664} 682}
665 683