• Jeremy Kerr's avatar
    powerpc/spufs: Fix race for a free SPU · b65fe035
    Jeremy Kerr authored
    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: default avatarJeremy Kerr <jk@ozlabs.org>
    b65fe035
sched.c 28.8 KB