From 93a03c35b83f0c1f285669b67d87461329b5f22f Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Tue, 13 Feb 2007 21:54:25 +0100 Subject: [PATCH] --- yaml --- r: 48251 b: refs/heads/master c: 678b2ff1e65ecccdb15cbfe97081572fc35944b7 h: refs/heads/master i: 48249: ea42ecf6660f0e6b00c5fd3972aeb1f81a5f262e 48247: 985eff0b25a95dd74a2e3b81d38ffa2ff62de2e3 v: v3 --- [refs] | 2 +- .../arch/powerpc/platforms/cell/spufs/sched.c | 44 +++++++------------ 2 files changed, 16 insertions(+), 30 deletions(-) diff --git a/[refs] b/[refs] index 6a57e26ad2e6..bf8a601a0ad2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 26bec67386dbf6ef887254e815398842e182cdcd +refs/heads/master: 678b2ff1e65ecccdb15cbfe97081572fc35944b7 diff --git a/trunk/arch/powerpc/platforms/cell/spufs/sched.c b/trunk/arch/powerpc/platforms/cell/spufs/sched.c index 07d0d095c62a..40202a752a7a 100644 --- a/trunk/arch/powerpc/platforms/cell/spufs/sched.c +++ b/trunk/arch/powerpc/platforms/cell/spufs/sched.c @@ -83,27 +83,14 @@ static void spu_add_to_active_list(struct spu *spu) /** * spu_remove_from_active_list - remove spu from active list * @spu: spu to remove from the active list - * - * This function removes an spu from the active list. If the spu was - * found on the active list the function returns 1, else it doesn't do - * anything and returns 0. */ -static int spu_remove_from_active_list(struct spu *spu) +static void spu_remove_from_active_list(struct spu *spu) { int node = spu->node; - struct spu *tmp; - int rc = 0; mutex_lock(&spu_prio->active_mutex[node]); - list_for_each_entry(tmp, &spu_prio->active_list[node], list) { - if (tmp == spu) { - list_del_init(&spu->list); - rc = 1; - break; - } - } + list_del_init(&spu->list); mutex_unlock(&spu_prio->active_mutex[node]); - return rc; } static inline void mm_needs_global_tlbie(struct mm_struct *mm) @@ -167,16 +154,13 @@ static void spu_bind_context(struct spu *spu, struct spu_context *ctx) * spu_unbind_context - unbind spu context from physical spu * @spu: physical spu to unbind from * @ctx: context to unbind - * - * If the spu was on the active list the function returns 1, else 0. */ -static int spu_unbind_context(struct spu *spu, struct spu_context *ctx) +static void spu_unbind_context(struct spu *spu, struct spu_context *ctx) { - int was_active = spu_remove_from_active_list(spu); - pr_debug("%s: unbind pid=%d SPU=%d NODE=%d\n", __FUNCTION__, spu->pid, spu->number, spu->node); + spu_remove_from_active_list(spu); spu_switch_notify(spu, NULL); spu_unmap_mappings(ctx); spu_save(&ctx->csa, spu); @@ -193,8 +177,6 @@ static int spu_unbind_context(struct spu *spu, struct spu_context *ctx) ctx->spu = NULL; spu->flags = 0; spu->ctx = NULL; - - return was_active; } /** @@ -340,17 +322,21 @@ int spu_activate(struct spu_context *ctx, unsigned long flags) return -ERESTARTSYS; } +/** + * spu_deactivate - unbind a context from it's physical spu + * @ctx: spu context to unbind + * + * Unbind @ctx from the physical spu it is running on and schedule + * the highest priority context to run on the freed physical spu. + */ void spu_deactivate(struct spu_context *ctx) { - struct spu *spu; - int was_active; + struct spu *spu = ctx->spu; - spu = ctx->spu; - if (!spu) - return; - was_active = spu_unbind_context(spu, ctx); - if (was_active) + if (spu) { + spu_unbind_context(spu, ctx); spu_reschedule(spu); + } } void spu_yield(struct spu_context *ctx)