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: Luke Browning <lukebrowning@us.ibm.com> Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
This commit is contained in:
committed by
Jeremy Kerr
parent
2c911a14b7
commit
028fda0a6c
@@ -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)
|
|||||||
/* 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user