diff options
author | 2008-09-04 21:16:27 +0000 | |
---|---|---|
committer | 2008-09-08 09:44:43 +1000 | |
commit | b2e601d14deb2083e2a537b47869ab3895d23a28 (patch) | |
tree | 302034680d5c7217c28d3b7dff025bd73eeee8c4 /arch | |
parent | powerpc/spufs: Fix race for a free SPU (diff) | |
download | linux-b2e601d14deb2083e2a537b47869ab3895d23a28.tar.gz linux-b2e601d14deb2083e2a537b47869ab3895d23a28.tar.bz2 linux-b2e601d14deb2083e2a537b47869ab3895d23a28.zip |
powerpc/spufs: Fix possible scheduling of a context to multiple SPEs
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>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/platforms/cell/spufs/sched.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index 897c74061168..67595bc380dc 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c @@ -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); } |