]> git.baikalelectronics.ru Git - kernel.git/commit
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)
commite3475c9956fbdf0d060a3c9005f28bc706b06efd
treea5b1e1e16695c6335cdcb51aa2a4a0d47b2b690a
parentec57280e12082386175690e7be04fdd9448790e4
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