Commit 9cf7f7fa authored by Paul Mackerras's avatar Paul Mackerras

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jk/spufs into merge

parents 86f4e5d4 c368392a
...@@ -170,7 +170,8 @@ void spu_release_saved(struct spu_context *ctx) ...@@ -170,7 +170,8 @@ void spu_release_saved(struct spu_context *ctx)
{ {
BUG_ON(ctx->state != SPU_STATE_SAVED); BUG_ON(ctx->state != SPU_STATE_SAVED);
if (test_and_clear_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags)) if (test_and_clear_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags) &&
test_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags))
spu_activate(ctx, 0); spu_activate(ctx, 0);
spu_release(ctx); spu_release(ctx);
......
...@@ -220,6 +220,7 @@ static int spu_run_init(struct spu_context *ctx, u32 *npc) ...@@ -220,6 +220,7 @@ static int spu_run_init(struct spu_context *ctx, u32 *npc)
} }
} }
set_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags);
return 0; return 0;
} }
...@@ -234,7 +235,7 @@ static int spu_run_fini(struct spu_context *ctx, u32 *npc, ...@@ -234,7 +235,7 @@ static int spu_run_fini(struct spu_context *ctx, u32 *npc,
*npc = ctx->ops->npc_read(ctx); *npc = ctx->ops->npc_read(ctx);
spuctx_switch_state(ctx, SPU_UTIL_IDLE_LOADED); spuctx_switch_state(ctx, SPU_UTIL_IDLE_LOADED);
ctx->policy = SCHED_IDLE; clear_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags);
spu_release(ctx); spu_release(ctx);
if (signal_pending(current)) if (signal_pending(current))
......
...@@ -867,7 +867,7 @@ static noinline void spusched_tick(struct spu_context *ctx) ...@@ -867,7 +867,7 @@ static noinline void spusched_tick(struct spu_context *ctx)
if (ctx->policy == SCHED_FIFO) if (ctx->policy == SCHED_FIFO)
goto out; goto out;
if (--ctx->time_slice && ctx->policy != SCHED_IDLE) if (--ctx->time_slice && test_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags))
goto out; goto out;
spu = ctx->spu; spu = ctx->spu;
...@@ -877,7 +877,7 @@ static noinline void spusched_tick(struct spu_context *ctx) ...@@ -877,7 +877,7 @@ static noinline void spusched_tick(struct spu_context *ctx)
new = grab_runnable_context(ctx->prio + 1, spu->node); new = grab_runnable_context(ctx->prio + 1, spu->node);
if (new) { if (new) {
spu_unschedule(spu, ctx); spu_unschedule(spu, ctx);
if (ctx->policy != SCHED_IDLE) if (test_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags))
spu_add_to_rq(ctx); spu_add_to_rq(ctx);
} else { } else {
spu_context_nospu_trace(spusched_tick__newslice, ctx); spu_context_nospu_trace(spusched_tick__newslice, ctx);
......
...@@ -44,6 +44,7 @@ struct spu_gang; ...@@ -44,6 +44,7 @@ struct spu_gang;
enum { enum {
SPU_SCHED_NOTIFY_ACTIVE, SPU_SCHED_NOTIFY_ACTIVE,
SPU_SCHED_WAS_ACTIVE, /* was active upon spu_acquire_saved() */ SPU_SCHED_WAS_ACTIVE, /* was active upon spu_acquire_saved() */
SPU_SCHED_SPU_RUN, /* context is within spu_run */
}; };
struct spu_context { struct spu_context {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment