[Intel-gfx] [PATCH] drm/i915: Poison rings after use
Mika Kuoppala
mika.kuoppala at linux.intel.com
Tue Feb 11 13:53:56 UTC 2020
Chris Wilson <chris at chris-wilson.co.uk> writes:
> 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: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> ---
> drivers/gpu/drm/i915/i915_request.c | 26 +++++++++++++++++---------
> 1 file changed, 17 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
> index 0ecc2cf64216..9ee7bf0200b0 100644
> --- a/drivers/gpu/drm/i915/i915_request.c
> +++ b/drivers/gpu/drm/i915/i915_request.c
> @@ -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)
> {
> struct intel_engine_cs *engine, *locked;
> @@ -247,6 +260,9 @@ bool i915_request_retire(struct i915_request *rq)
> */
> GEM_BUG_ON(!list_is_first(&rq->link,
> &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);
Would it be too detrimental for perf to check for POISON_FREE when
we emit the requests?
I think it is a positive problem that we are in brink
of a DEBUG_GEM_LEVEL split :O
Regardless, with this we get gpu helping on revealing
our bookkeepping failures.
Reviewed-by: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> rq->ring->head = rq->postfix;
>
> /*
> @@ -1175,9 +1191,6 @@ i915_request_await_object(struct i915_request *to,
>
> 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));
> dma_fence_set_error(&rq->fence, error);
>
> @@ -1189,12 +1202,7 @@ void i915_request_skip(struct i915_request *rq, int error)
> * context, clear out all the user operations leaving the
> * breadcrumb at the end (so we get the fence notifications).
> */
> - head = rq->infix;
> - if (rq->postfix < head) {
> - memset(vaddr + head, 0, rq->ring->size - head);
> - head = 0;
> - }
> - memset(vaddr + head, 0, rq->postfix - head);
> + __i915_request_fill(rq, 0);
> rq->infix = rq->postfix;
> }
>
> --
> 2.25.0
More information about the Intel-gfx
mailing list