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

Commit fc9d4d2b authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Do not record a successful syncpoint for a dma-await



As we may unwind the requests, even though the request we are awaiting
has a global_seqno that seqno may be revoked during the await and so we
can not reliably use it as a barrier for all future awaits on the same
timeline.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Michał Winiarski <michal.winiarski@intel.com>
Reviewed-by: default avatarMichał Winiarski <michal.winiarski@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170503093924.5320-6-chris@chris-wilson.co.uk
parent 7e8894e9
Loading
Loading
Loading
Loading
+19 −18
Original line number Diff line number Diff line
@@ -708,33 +708,34 @@ i915_gem_request_await_request(struct drm_i915_gem_request *to,
	}

	seqno = i915_gem_request_global_seqno(from);
	if (!seqno) {
		ret = i915_sw_fence_await_dma_fence(&to->submit,
						    &from->fence, 0,
						    GFP_KERNEL);
		return ret < 0 ? ret : 0;
	}
	if (!seqno)
		goto await_dma_fence;

	if (!i915.semaphores) {
		if (!__i915_gem_request_started(from, seqno))
			goto await_dma_fence;

		if (!__i915_spin_request(from, seqno, TASK_INTERRUPTIBLE, 2))
			goto await_dma_fence;
	} else {
		if (seqno <= to->timeline->global_sync[from->engine->id])
			return 0;

		trace_i915_gem_ring_sync_to(to, from);
	if (!i915.semaphores) {
		if (!i915_spin_request(from, TASK_INTERRUPTIBLE, 2)) {
			ret = i915_sw_fence_await_dma_fence(&to->submit,
							    &from->fence, 0,
							    GFP_KERNEL);
			if (ret < 0)
				return ret;
		}
	} else {
		ret = to->engine->semaphore.sync_to(to, from);
		if (ret)
			return ret;
	}

		to->timeline->global_sync[from->engine->id] = seqno;
	}

	return 0;

await_dma_fence:
	ret = i915_sw_fence_await_dma_fence(&to->submit,
					    &from->fence, 0,
					    GFP_KERNEL);
	return ret < 0 ? ret : 0;
}

int