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

Commit 50b520d4 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Arnd Bergmann
Browse files

[POWERPC] avoid SPU_ACTIVATE_NOWAKE optimization



This optimization was added recently but is still buggy,
so back it out for now.

Signed-off-by: default avatarArnd Bergmann <arnd.bergmann@de.ibm.com>
parent aa0ed2bd
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ static inline int spu_run_init(struct spu_context *ctx, u32 * npc)
	int ret;
	unsigned long runcntl = SPU_RUNCNTL_RUNNABLE;

	ret = spu_acquire_runnable(ctx, SPU_ACTIVATE_NOWAKE);
	ret = spu_acquire_runnable(ctx, 0);
	if (ret)
		return ret;

@@ -155,7 +155,7 @@ static inline int spu_run_init(struct spu_context *ctx, u32 * npc)
			spu_release(ctx);
			ret = spu_setup_isolated(ctx);
			if (!ret)
				ret = spu_acquire_runnable(ctx, SPU_ACTIVATE_NOWAKE);
				ret = spu_acquire_runnable(ctx, 0);
		}

		/* if userspace has set the runcntrl register (eg, to issue an
+2 −5
Original line number Diff line number Diff line
@@ -263,7 +263,6 @@ static void spu_prio_wait(struct spu_context *ctx)
{
	DEFINE_WAIT(wait);

	set_bit(SPU_SCHED_WAKE, &ctx->sched_flags);
	prepare_to_wait_exclusive(&ctx->stop_wq, &wait, TASK_INTERRUPTIBLE);
	if (!signal_pending(current)) {
		mutex_unlock(&ctx->state_mutex);
@@ -272,7 +271,6 @@ static void spu_prio_wait(struct spu_context *ctx)
	}
	__set_current_state(TASK_RUNNING);
	remove_wait_queue(&ctx->stop_wq, &wait);
	clear_bit(SPU_SCHED_WAKE, &ctx->sched_flags);
}

/**
@@ -292,7 +290,7 @@ static void spu_reschedule(struct spu *spu)
	best = sched_find_first_bit(spu_prio->bitmap);
	if (best < MAX_PRIO) {
		struct spu_context *ctx = spu_grab_context(best);
		if (ctx && test_bit(SPU_SCHED_WAKE, &ctx->sched_flags))
		if (ctx)
			wake_up(&ctx->stop_wq);
	}
	spin_unlock(&spu_prio->runq_lock);
@@ -414,7 +412,6 @@ int spu_activate(struct spu_context *ctx, unsigned long flags)
		}

		spu_add_to_rq(ctx);
		if (!(flags & SPU_ACTIVATE_NOWAKE))
		spu_prio_wait(ctx);
		spu_del_from_rq(ctx);
	} while (!signal_pending(current));
+2 −4
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ struct spu_gang;

/* ctx->sched_flags */
enum {
	SPU_SCHED_WAKE = 0,
	SPU_SCHED_WAKE = 0, /* currently unused */
};

struct spu_context {
@@ -191,9 +191,7 @@ void spu_forget(struct spu_context *ctx);
int spu_acquire_runnable(struct spu_context *ctx, unsigned long flags);
void spu_acquire_saved(struct spu_context *ctx);
int spu_acquire_exclusive(struct spu_context *ctx);
enum {
	SPU_ACTIVATE_NOWAKE = 1,
};

int spu_activate(struct spu_context *ctx, unsigned long flags);
void spu_deactivate(struct spu_context *ctx);
void spu_yield(struct spu_context *ctx);