[POWERPC] spufs: fix invalid scheduling of forgotten contexts
At present, we have a situation where a context with no owner is re-scheduled by spu_forget: Thread 1: reading regs file Thread 2: context owner spu_forget() - ctx->owner = NULL - set SPU_SCHED_WAS_ACTIVE spu_acquire_saved() - context is in saved state spu_release_saved() - SPU_SCHED_WAS_ACTIVE is set, so spu_activate() the context, which now has no owner In spu_forget(), we shouldn't be requesting a re-schedule by setting SPU_SCHED_WAS_ACTIVE. This change removes the set_bit in spu_forget(), so that spu_release_saved() doesn't reinsert this destroyed context on to the run queue. Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
This commit is contained in:
parent
d58831375d
commit
0111a70186
|
@ -109,13 +109,12 @@ void spu_forget(struct spu_context *ctx)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is basically an open-coded spu_acquire_saved, except that
|
* This is basically an open-coded spu_acquire_saved, except that
|
||||||
* we don't acquire the state mutex interruptible.
|
* we don't acquire the state mutex interruptible, and we don't
|
||||||
|
* want this context to be rescheduled on release.
|
||||||
*/
|
*/
|
||||||
mutex_lock(&ctx->state_mutex);
|
mutex_lock(&ctx->state_mutex);
|
||||||
if (ctx->state != SPU_STATE_SAVED) {
|
if (ctx->state != SPU_STATE_SAVED)
|
||||||
set_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags);
|
|
||||||
spu_deactivate(ctx);
|
spu_deactivate(ctx);
|
||||||
}
|
|
||||||
|
|
||||||
mm = ctx->owner;
|
mm = ctx->owner;
|
||||||
ctx->owner = NULL;
|
ctx->owner = NULL;
|
||||||
|
|
Loading…
Reference in New Issue