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

Commit 2ccdf6a1 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Pass intel_context to i915_request_create()



Start acquiring the logical intel_context and using that as our primary
means for request allocation. This is the initial step to allow us to
avoid requiring struct_mutex for request allocation along the
perma-pinned kernel context, but it also provides a foundation for
breaking up the complex request allocation to handle different scenarios
inside execbuf.

For the purpose of emitting a request from inside retirement (see the
next patch for engine power management), we also need to lift control
over the timeline mutex to the caller.

v2: Note that the request carries the active reference upon construction.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190424200717.1686-4-chris@chris-wilson.co.uk
parent 6eee33e8
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -105,4 +105,16 @@ static inline void intel_context_put(struct intel_context *ce)
	kref_put(&ce->ref, ce->ops->destroy);
}

static inline void intel_context_timeline_lock(struct intel_context *ce)
	__acquires(&ce->ring->timeline->mutex)
{
	mutex_lock(&ce->ring->timeline->mutex);
}

static inline void intel_context_timeline_unlock(struct intel_context *ce)
	__releases(&ce->ring->timeline->mutex)
{
	mutex_unlock(&ce->ring->timeline->mutex);
}

#endif /* __INTEL_CONTEXT_H__ */
+1 −1
Original line number Diff line number Diff line
@@ -783,7 +783,7 @@ static void restart_work(struct work_struct *work)
		if (!intel_engine_is_idle(engine))
			continue;

		rq = i915_request_alloc(engine, i915->kernel_context);
		rq = i915_request_create(engine->kernel_context);
		if (!IS_ERR(rq))
			i915_request_add(rq);
	}
+0 −3
Original line number Diff line number Diff line
@@ -1772,7 +1772,6 @@ static int switch_context(struct i915_request *rq)
	u32 hw_flags = 0;
	int ret, i;

	lockdep_assert_held(&rq->i915->drm.struct_mutex);
	GEM_BUG_ON(HAS_EXECLISTS(rq->i915));

	if (ppgtt) {
@@ -1902,8 +1901,6 @@ static noinline int wait_for_space(struct intel_ring *ring, unsigned int bytes)
	struct i915_request *target;
	long timeout;

	lockdep_assert_held(&ring->vma->vm->i915->drm.struct_mutex);

	if (intel_ring_update_space(ring) >= bytes)
		return 0;

+1 −1
Original line number Diff line number Diff line
@@ -1356,7 +1356,7 @@ static int engine_wa_list_verify(struct intel_engine_cs *engine,
	if (IS_ERR(vma))
		return PTR_ERR(vma);

	rq = i915_request_alloc(engine, engine->kernel_context->gem_context);
	rq = i915_request_create(engine->kernel_context);
	if (IS_ERR(rq)) {
		err = PTR_ERR(rq);
		goto err_vma;
+2 −2
Original line number Diff line number Diff line
@@ -942,7 +942,7 @@ int i915_gem_switch_to_kernel_context(struct drm_i915_private *i915,
		struct intel_ring *ring;
		struct i915_request *rq;

		rq = i915_request_alloc(engine, i915->kernel_context);
		rq = i915_request_create(engine->kernel_context);
		if (IS_ERR(rq))
			return PTR_ERR(rq);

@@ -1188,7 +1188,7 @@ gen8_modify_rpcs(struct intel_context *ce, struct intel_sseu sseu)
	/* Submitting requests etc needs the hw awake. */
	wakeref = intel_runtime_pm_get(i915);

	rq = i915_request_alloc(ce->engine, i915->kernel_context);
	rq = i915_request_create(ce->engine->kernel_context);
	if (IS_ERR(rq)) {
		ret = PTR_ERR(rq);
		goto out_put;
Loading