Commit 028fda0a authored by Luke Browning's avatar Luke Browning Committed by Jeremy Kerr

powerpc/spufs: fix missed stop-and-signal event

There is a delay in the transition to the stopped state for class 2
interrupts. In some cases, the controlling thread detects the state of
the spu as running, and goes back to sleep resulting in a hung
application as the event is missed.

This change detects the stop condition and re-generates the wakeup event
after a context save.
Signed-off-by: default avatarLuke Browning <lukebrowning@us.ibm.com>
Signed-off-by: default avatarJeremy Kerr <jk@ozlabs.org>
parent 2c911a14
...@@ -407,6 +407,8 @@ static int has_affinity(struct spu_context *ctx) ...@@ -407,6 +407,8 @@ static int has_affinity(struct spu_context *ctx)
*/ */
static void spu_unbind_context(struct spu *spu, struct spu_context *ctx) static void spu_unbind_context(struct spu *spu, struct spu_context *ctx)
{ {
u32 status;
spu_context_trace(spu_unbind_context__enter, ctx, spu); spu_context_trace(spu_unbind_context__enter, ctx, spu);
spuctx_switch_state(ctx, SPU_UTIL_SYSTEM); spuctx_switch_state(ctx, SPU_UTIL_SYSTEM);
...@@ -452,6 +454,9 @@ static void spu_unbind_context(struct spu *spu, struct spu_context *ctx) ...@@ -452,6 +454,9 @@ static void spu_unbind_context(struct spu *spu, struct spu_context *ctx)
/* This maps the underlying spu state to idle */ /* This maps the underlying spu state to idle */
spuctx_switch_state(ctx, SPU_UTIL_IDLE_LOADED); spuctx_switch_state(ctx, SPU_UTIL_IDLE_LOADED);
ctx->spu = NULL; ctx->spu = NULL;
if (spu_stopped(ctx, &status))
wake_up_all(&ctx->stop_wq);
} }
/** /**
......
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