]> err.no Git - linux-2.6/commitdiff
[POWERPC] spu sched: simplity spu_remove_from_active_list
authorChristoph Hellwig <hch@lst.de>
Tue, 13 Feb 2007 20:54:25 +0000 (21:54 +0100)
committerArnd Bergmann <arnd@klappe.arndb.de>
Tue, 13 Feb 2007 20:55:41 +0000 (21:55 +0100)
If we call spu_remove_from_active_list that spu is always guaranteed
to be on the active list and in runnable state, so we can simply
do a list_del to remove it and unconditionally take the was_active
codepath.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>
arch/powerpc/platforms/cell/spufs/sched.c

index 07d0d095c62a4d64add130ae0c3c70b8d3bccd11..40202a752a7a5f62d3465729ffaeea738f7c104f 100644 (file)
@@ -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)