]> err.no Git - linux-2.6/commitdiff
[POWERPC] spufs: Fix timing dependent false return from spufs_run_spu
authorLuke Browning <lukebr@linux.vnet.ibm.com>
Fri, 8 Feb 2008 04:50:41 +0000 (15:50 +1100)
committerPaul Mackerras <paulus@samba.org>
Fri, 8 Feb 2008 08:52:36 +0000 (19:52 +1100)
Stop bits are only valid when the running bit is not set.  Status bits
carry over from one invocation of spufs_run_spu() to another, so the
RUNNING bit gets added to the previous state of the register which may
have been a remote library call.  In this case, it looks like another
library routine should be invoked, but the spe is actually running.

This fixes a problem with a testcase that exercises the scheduler.

Signed-off-by: Luke Browning <lukebrowning@us.ibm.com>
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/platforms/cell/spufs/run.c

index f401e51a797968d7a5715d890a72fc99f76a7557..fca22e18069a74bcaa5a398682aed5cdea4d64a3 100644 (file)
@@ -53,7 +53,7 @@ int spu_stopped(struct spu_context *ctx, u32 *stat)
 
        stopped = SPU_STATUS_INVALID_INSTR | SPU_STATUS_SINGLE_STEP |
                SPU_STATUS_STOPPED_BY_HALT | SPU_STATUS_STOPPED_BY_STOP;
-       if (*stat & stopped)
+       if (!(*stat & SPU_STATUS_RUNNING) && (*stat & stopped))
                return 1;
 
        dsisr = ctx->csa.dsisr;