powerpc/spufs: Fix race for a free SPU
authorJeremy Kerr <jk@ozlabs.org>
Thu, 4 Sep 2008 05:02:47 +0000 (15:02 +1000)
committerJeremy Kerr <jk@ozlabs.org>
Fri, 5 Sep 2008 00:52:03 +0000 (10:52 +1000)
commitb65fe0356b5b732d7e1e0224c6a1cf2eb5255984
treea5b1e1e16695c6335cdcb51aa2a4a0d47b2b690a
parent9f43e3914dceb0f8191875b3cdf4325b48d0d70a
powerpc/spufs: Fix race for a free SPU

We currently have a race for a free SPE. With one thread doing a
spu_yield(), and another doing a spu_activate():

thread 1 thread 2
spu_yield(oldctx) spu_activate(ctx)
  __spu_deactivate(oldctx)
  spu_unschedule(oldctx, spu)
  spu->alloc_state = SPU_FREE
spu = spu_get_idle(ctx)
    - searches for a SPE in
      state SPU_FREE, gets
      the context just
      freed by thread 1
spu_schedule(ctx, spu)
  spu->alloc_state = SPU_USED
spu_schedule(newctx, spu)
  - assumes spu is still free
  - tries to schedule context on
    already-used spu

This change introduces a 'free_spu' flag to spu_unschedule, to indicate
whether or not the function should free the spu after descheduling the
context. We only set this flag if we're not going to re-schedule
another context on this SPU.

Add a comment to document this behaviour.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
arch/powerpc/platforms/cell/spufs/sched.c