Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3fef5cda authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Automatic i915_switch_context for legacy



During request construction, after pinning the context we know whether
or not we have to emit a context switch. So move this common operation
from every caller into i915_gem_request_alloc() itself.

v2: Always submit the request if we emitted some commands during request
construction, as typically it also involves changes in global state.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171120102002.22254-2-chris@chris-wilson.co.uk
parent 2113184c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -5045,7 +5045,7 @@ static int __intel_engines_record_defaults(struct drm_i915_private *i915)
			goto out_ctx;
		}

		err = i915_switch_context(rq);
		err = 0;
		if (engine->init_context)
			err = engine->init_context(rq);

+1 −6
Original line number Diff line number Diff line
@@ -842,8 +842,7 @@ int i915_switch_context(struct drm_i915_gem_request *req)
	struct intel_engine_cs *engine = req->engine;

	lockdep_assert_held(&req->i915->drm.struct_mutex);
	if (i915_modparams.enable_execlists)
		return 0;
	GEM_BUG_ON(i915_modparams.enable_execlists);

	if (!req->ctx->engine[engine->id].state) {
		struct i915_gem_context *to = req->ctx;
@@ -899,7 +898,6 @@ int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv)

	for_each_engine(engine, dev_priv, id) {
		struct drm_i915_gem_request *req;
		int ret;

		if (engine_has_idle_kernel_context(engine))
			continue;
@@ -922,10 +920,7 @@ int i915_gem_switch_to_kernel_context(struct drm_i915_private *dev_priv)
								 GFP_KERNEL);
		}

		ret = i915_switch_context(req);
		i915_add_request(req);
		if (ret)
			return ret;
	}

	return 0;
+0 −8
Original line number Diff line number Diff line
@@ -1111,10 +1111,6 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
	if (err)
		goto err_request;

	err = i915_switch_context(rq);
	if (err)
		goto err_request;

	err = eb->engine->emit_bb_start(rq,
					batch->node.start, PAGE_SIZE,
					cache->gen > 5 ? 0 : I915_DISPATCH_SECURE);
@@ -1960,10 +1956,6 @@ static int eb_submit(struct i915_execbuffer *eb)
	if (err)
		return err;

	err = i915_switch_context(eb->request);
	if (err)
		return err;

	if (eb->args->flags & I915_EXEC_GEN7_SOL_RESET) {
		err = i915_reset_gen7_sol_offsets(eb->request);
		if (err)
+4 −0
Original line number Diff line number Diff line
@@ -624,6 +624,10 @@ i915_gem_request_alloc(struct intel_engine_cs *engine,
	if (ret)
		goto err_unpin;

	ret = intel_ring_wait_for_space(ring, MIN_SPACE_FOR_ADD_REQUEST);
	if (ret)
		goto err_unreserve;

	/* Move the oldest request to the slab-cache (if not in use!) */
	req = list_first_entry_or_null(&engine->timeline->requests,
				       typeof(*req), link);
+1 −2
Original line number Diff line number Diff line
@@ -1726,10 +1726,9 @@ static int gen8_switch_to_updated_kernel_context(struct drm_i915_private *dev_pr
							 GFP_KERNEL);
	}

	ret = i915_switch_context(req);
	i915_add_request(req);

	return ret;
	return 0;
}

/*
Loading