Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0111a701 authored by Jeremy Kerr's avatar Jeremy Kerr
Browse files

[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: default avatarJeremy Kerr <jk@ozlabs.org>
parent d5883137
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -109,13 +109,12 @@ void spu_forget(struct spu_context *ctx)

	/*
	 * 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);
	if (ctx->state != SPU_STATE_SAVED) {
		set_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags);
	if (ctx->state != SPU_STATE_SAVED)
		spu_deactivate(ctx);
	}

	mm = ctx->owner;
	ctx->owner = NULL;