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

Commit 70d6894d authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Serialize against vma moves



Make sure that when submitting requests, we always serialize against
potential vma moves and clflushes.

Time for a i915_request_await_vma() interface!

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190819112033.30638-1-chris@chris-wilson.co.uk
parent a1e37b02
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1192,7 +1192,8 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
		goto skip_request;

	i915_vma_lock(batch);
	GEM_BUG_ON(!reservation_object_test_signaled_rcu(batch->resv, true));
	err = i915_request_await_object(rq, batch->obj, false);
	if (err == 0)
		err = i915_vma_move_to_active(batch, rq, 0);
	i915_vma_unlock(batch);
	if (err)
+6 −2
Original line number Diff line number Diff line
@@ -106,6 +106,8 @@ int intel_emit_vma_mark_active(struct i915_vma *vma, struct i915_request *rq)
	int err;

	i915_vma_lock(vma);
	err = i915_request_await_object(rq, vma->obj, false);
	if (err == 0)
		err = i915_vma_move_to_active(vma, rq, 0);
	i915_vma_unlock(vma);
	if (unlikely(err))
@@ -171,6 +173,8 @@ int i915_gem_object_fill_blt(struct drm_i915_gem_object *obj,
	}

	i915_vma_lock(vma);
	err = i915_request_await_object(rq, vma->obj, true);
	if (err == 0)
		err = i915_vma_move_to_active(vma, rq, EXEC_OBJECT_WRITE);
	i915_vma_unlock(vma);
	if (unlikely(err))
+3 −1
Original line number Diff line number Diff line
@@ -228,6 +228,8 @@ static int gpu_set(struct drm_i915_gem_object *obj,
	intel_ring_advance(rq, cs);

	i915_vma_lock(vma);
	err = i915_request_await_object(rq, vma->obj, true);
	if (err == 0)
		err = i915_vma_move_to_active(vma, rq, EXEC_OBJECT_WRITE);
	i915_vma_unlock(vma);
	i915_vma_unpin(vma);
+12 −4
Original line number Diff line number Diff line
@@ -666,12 +666,16 @@ emit_rpcs_query(struct drm_i915_gem_object *obj,
		goto err_request;

	i915_vma_lock(batch);
	err = i915_request_await_object(rq, batch->obj, false);
	if (err == 0)
		err = i915_vma_move_to_active(batch, rq, 0);
	i915_vma_unlock(batch);
	if (err)
		goto skip_request;

	i915_vma_lock(vma);
	err = i915_request_await_object(rq, vma->obj, true);
	if (err == 0)
		err = i915_vma_move_to_active(vma, rq, EXEC_OBJECT_WRITE);
	i915_vma_unlock(vma);
	if (err)
@@ -1218,6 +1222,8 @@ static int write_to_scratch(struct i915_gem_context *ctx,
		goto err_request;

	i915_vma_lock(vma);
	err = i915_request_await_object(rq, vma->obj, false);
	if (err == 0)
		err = i915_vma_move_to_active(vma, rq, 0);
	i915_vma_unlock(vma);
	if (err)
@@ -1315,6 +1321,8 @@ static int read_from_scratch(struct i915_gem_context *ctx,
		goto err_request;

	i915_vma_lock(vma);
	err = i915_request_await_object(rq, vma->obj, true);
	if (err == 0)
		err = i915_vma_move_to_active(vma, rq, EXEC_OBJECT_WRITE);
	i915_vma_unlock(vma);
	if (err)
+4 −1
Original line number Diff line number Diff line
@@ -351,7 +351,10 @@ static int make_obj_busy(struct drm_i915_gem_object *obj)
		}

		i915_vma_lock(vma);
		err = i915_vma_move_to_active(vma, rq, EXEC_OBJECT_WRITE);
		err = i915_request_await_object(rq, vma->obj, true);
		if (err == 0)
			err = i915_vma_move_to_active(vma, rq,
						      EXEC_OBJECT_WRITE);
		i915_vma_unlock(vma);

		i915_request_add(rq);
Loading