powerpc/spufs: Fix possible scheduling of a context to multiple SPEs
authorAndre Detsch <adetsch@br.ibm.com>
Thu, 4 Sep 2008 21:16:27 +0000 (21:16 +0000)
committerJeremy Kerr <jk@ozlabs.org>
Sun, 7 Sep 2008 23:44:43 +0000 (09:44 +1000)
We currently have a race when scheduling a context to a SPE -
after we have found a runnable context in spusched_tick, the same
context may have been scheduled by spu_activate().

This may result in a panic if we try to unschedule a context that has
been freed in the meantime.

This change exits spu_schedule() if the context has already been
scheduled, so we don't end up scheduling it twice.

Signed-off-by: Andre Detsch <adetsch@br.ibm.com>
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
arch/powerpc/platforms/cell/spufs/sched.c

index 897c7406116862a656dd33204347c7007bf053d1..67595bc380dc154465682f9be7f9c203d283bfe5 100644 (file)
@@ -728,7 +728,8 @@ static void spu_schedule(struct spu *spu, struct spu_context *ctx)
        /* not a candidate for interruptible because it's called either
           from the scheduler thread or from spu_deactivate */
        mutex_lock(&ctx->state_mutex);
-       __spu_schedule(spu, ctx);
+       if (ctx->state == SPU_STATE_SAVED)
+               __spu_schedule(spu, ctx);
        spu_release(ctx);
 }