Commit 36e191f0 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Apply i915_request_skip() on submission



Trying to use i915_request_skip() prior to i915_request_add() causes us
to try and fill the ring upto request->postfix, which has not yet been
set, and so may cause us to memset() past the end of the ring.

Instead of skipping the request immediately, just flag the error on the
request (only accepting the first fatal error we see) and then clear the
request upon submission.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200304121849.2448028-1-chris@chris-wilson.co.uk
parent 56ed441a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -217,7 +217,7 @@ static void clear_pages_worker(struct work_struct *work)
					   0);
out_request:
	if (unlikely(err)) {
		i915_request_skip(rq, err);
		i915_request_set_error_once(rq, err);
		err = 0;
	}

+4 −3
Original line number Diff line number Diff line
@@ -1169,7 +1169,7 @@ static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
	goto out_pool;

skip_request:
	i915_request_skip(rq, err);
	i915_request_set_error_once(rq, err);
err_request:
	i915_request_add(rq);
err_unpin:
@@ -1850,7 +1850,7 @@ static int eb_move_to_gpu(struct i915_execbuffer *eb)
	return 0;

err_skip:
	i915_request_skip(eb->request, err);
	i915_request_set_error_once(eb->request, err);
	return err;
}

@@ -2579,7 +2579,8 @@ static void eb_request_add(struct i915_execbuffer *eb)
			attr.priority |= I915_PRIORITY_WAIT;
	} else {
		/* Serialise with context_close via the add_to_timeline */
		i915_request_skip(rq, -ENOENT);
		i915_request_set_error_once(rq, -ENOENT);
		__i915_request_skip(rq);
	}

	local_bh_disable();
+2 −2
Original line number Diff line number Diff line
@@ -186,7 +186,7 @@ int i915_gem_object_fill_blt(struct drm_i915_gem_object *obj,
					0);
out_request:
	if (unlikely(err))
		i915_request_skip(rq, err);
		i915_request_set_error_once(rq, err);

	i915_request_add(rq);
out_batch:
@@ -385,7 +385,7 @@ out_unlock:
	drm_gem_unlock_reservations(objs, ARRAY_SIZE(objs), &acquire);
out_request:
	if (unlikely(err))
		i915_request_skip(rq, err);
		i915_request_set_error_once(rq, err);

	i915_request_add(rq);
out_batch:
+3 −3
Original line number Diff line number Diff line
@@ -1004,7 +1004,7 @@ emit_rpcs_query(struct drm_i915_gem_object *obj,
	return 0;

skip_request:
	i915_request_skip(rq, err);
	i915_request_set_error_once(rq, err);
err_request:
	i915_request_add(rq);
err_batch:
@@ -1559,7 +1559,7 @@ static int write_to_scratch(struct i915_gem_context *ctx,

	goto out_vm;
skip_request:
	i915_request_skip(rq, err);
	i915_request_set_error_once(rq, err);
err_request:
	i915_request_add(rq);
err_unpin:
@@ -1708,7 +1708,7 @@ static int read_from_scratch(struct i915_gem_context *ctx,

	goto out_vm;
skip_request:
	i915_request_skip(rq, err);
	i915_request_set_error_once(rq, err);
err_request:
	i915_request_add(rq);
err_unpin:
+1 −1
Original line number Diff line number Diff line
@@ -159,7 +159,7 @@ int igt_gpu_fill_dw(struct intel_context *ce,
	return 0;

skip_request:
	i915_request_skip(rq, err);
	i915_request_set_error_once(rq, err);
err_request:
	i915_request_add(rq);
err_batch:
Loading