diff mbox

[1/3] drm/i915: Wait for render state init

Message ID 1426513596-11338-2-git-send-email-mika.kuoppala@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Mika Kuoppala March 16, 2015, 1:46 p.m. UTC
We are freeing the batch that is just pushed to ring.
Further, other ring inits should assume that the render
context with the workarounds are pushed before their rings
execute anything.

This fixes (or papers over) a problem where with full ppgtt
the blitter ring init sometimes fails, where the blt ring
ACTHD runs wild through the address space until eventually
hangcheck kills it.

With dynamic page table series this problem became more
easily reproduced by just normal boot failing to init blt ring,
instead of torturing init with gem_reset_stats.

Testcase: igt/gem_reset_stats --r ban-blt
Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
---
 drivers/gpu/drm/i915/i915_gem_render_state.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Chris Wilson March 16, 2015, 1:51 p.m. UTC | #1
On Mon, Mar 16, 2015 at 03:46:34PM +0200, Mika Kuoppala wrote:
> We are freeing the batch that is just pushed to ring.

Kill this. It is not correct.

> Further, other ring inits should assume that the render
> context with the workarounds are pushed before their rings
> execute anything.
> 
> This fixes (or papers over) a problem where with full ppgtt
> the blitter ring init sometimes fails, where the blt ring
> ACTHD runs wild through the address space until eventually
> hangcheck kills it.

Interesting. We don't do anything inside the golden render state to be
of relevance to the blitter engine. So I think this is pure paper and
will not ultimately fix the problem.
-Chris
Mika Kuoppala March 16, 2015, 2:20 p.m. UTC | #2
Chris Wilson <chris@chris-wilson.co.uk> writes:

> On Mon, Mar 16, 2015 at 03:46:34PM +0200, Mika Kuoppala wrote:
>> We are freeing the batch that is just pushed to ring.
>
> Kill this. It is not correct.
>
>> Further, other ring inits should assume that the render
>> context with the workarounds are pushed before their rings
>> execute anything.
>> 
>> This fixes (or papers over) a problem where with full ppgtt
>> the blitter ring init sometimes fails, where the blt ring
>> ACTHD runs wild through the address space until eventually
>> hangcheck kills it.
>
> Interesting. We don't do anything inside the golden render state to be
> of relevance to the blitter engine. So I think this is pure paper and
> will not ultimately fix the problem.
> -Chris
>

Perhaps not in the golden state, but do we push any workarounds through
render ring init, that are global in scope and required by the other rings?

-Mika
Chris Wilson March 16, 2015, 2:38 p.m. UTC | #3
On Mon, Mar 16, 2015 at 04:20:46PM +0200, Mika Kuoppala wrote:
> Perhaps not in the golden state, but do we push any workarounds through
> render ring init, that are global in scope and required by the other rings?

No. Afaict the w/a only apply to render. Or else we have been horribly
misinformed. I still suspect it is something due to the ordering of pd
loads between rings. Serialising the render context init should not fix
the similar hangs we see at runtime.
-Chris
Mika Kuoppala March 16, 2015, 3:56 p.m. UTC | #4
Chris Wilson <chris@chris-wilson.co.uk> writes:

> On Mon, Mar 16, 2015 at 04:20:46PM +0200, Mika Kuoppala wrote:
>> Perhaps not in the golden state, but do we push any workarounds through
>> render ring init, that are global in scope and required by the other rings?
>
> No. Afaict the w/a only apply to render. Or else we have been horribly
> misinformed. I still suspect it is something due to the ordering of pd
> loads between rings. Serialising the render context init should not fix
> the similar hangs we see at runtime.

Ok please ignore this patch then. I will send another that
does the immediate tail updates on ring->mm_switch.

-Mika
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_gem_render_state.c b/drivers/gpu/drm/i915/i915_gem_render_state.c
index 521548a..9484c64 100644
--- a/drivers/gpu/drm/i915/i915_gem_render_state.c
+++ b/drivers/gpu/drm/i915/i915_gem_render_state.c
@@ -175,6 +175,10 @@  int i915_gem_render_state_init(struct intel_engine_cs *ring)
 
 	ret = __i915_add_request(ring, NULL, so.obj);
 	/* __i915_add_request moves object to inactive if it fails */
+	if (ret)
+		goto out;
+
+	ret = intel_ring_idle(ring);
 out:
 	i915_gem_render_state_fini(&so);
 	return ret;