Commit 89dd019a authored by Chris Wilson's avatar Chris Wilson

drm/i915: Poison rings after use

On retiring the request, we should not re-use these elements in the ring
(at least not until we fill the ringbuffer and knowingly reuse the space).
Leave behind some poison to (hopefully) trap ourselves if we make a
mistake.
Suggested-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200211205615.1190127-1-chris@chris-wilson.co.uk
parent 42fb60de
...@@ -203,6 +203,19 @@ static void free_capture_list(struct i915_request *request) ...@@ -203,6 +203,19 @@ static void free_capture_list(struct i915_request *request)
} }
} }
static void __i915_request_fill(struct i915_request *rq, u8 val)
{
void *vaddr = rq->ring->vaddr;
u32 head;
head = rq->infix;
if (rq->postfix < head) {
memset(vaddr + head, val, rq->ring->size - head);
head = 0;
}
memset(vaddr + head, val, rq->postfix - head);
}
static void remove_from_engine(struct i915_request *rq) static void remove_from_engine(struct i915_request *rq)
{ {
struct intel_engine_cs *engine, *locked; struct intel_engine_cs *engine, *locked;
...@@ -247,6 +260,9 @@ bool i915_request_retire(struct i915_request *rq) ...@@ -247,6 +260,9 @@ bool i915_request_retire(struct i915_request *rq)
*/ */
GEM_BUG_ON(!list_is_first(&rq->link, GEM_BUG_ON(!list_is_first(&rq->link,
&i915_request_timeline(rq)->requests)); &i915_request_timeline(rq)->requests));
if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
/* Poison before we release our space in the ring */
__i915_request_fill(rq, POISON_FREE);
rq->ring->head = rq->postfix; rq->ring->head = rq->postfix;
/* /*
...@@ -1179,9 +1195,6 @@ i915_request_await_object(struct i915_request *to, ...@@ -1179,9 +1195,6 @@ i915_request_await_object(struct i915_request *to,
void i915_request_skip(struct i915_request *rq, int error) void i915_request_skip(struct i915_request *rq, int error)
{ {
void *vaddr = rq->ring->vaddr;
u32 head;
GEM_BUG_ON(!IS_ERR_VALUE((long)error)); GEM_BUG_ON(!IS_ERR_VALUE((long)error));
dma_fence_set_error(&rq->fence, error); dma_fence_set_error(&rq->fence, error);
...@@ -1193,12 +1206,7 @@ void i915_request_skip(struct i915_request *rq, int error) ...@@ -1193,12 +1206,7 @@ void i915_request_skip(struct i915_request *rq, int error)
* context, clear out all the user operations leaving the * context, clear out all the user operations leaving the
* breadcrumb at the end (so we get the fence notifications). * breadcrumb at the end (so we get the fence notifications).
*/ */
head = rq->infix; __i915_request_fill(rq, 0);
if (rq->postfix < head) {
memset(vaddr + head, 0, rq->ring->size - head);
head = 0;
}
memset(vaddr + head, 0, rq->postfix - head);
rq->infix = rq->postfix; rq->infix = rq->postfix;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment