[Cbe-oss-dev] [PATCH 1/3] spu sched: simplity spu_remove_from_active_list

Christoph Hellwig hch at lst.de
Fri Feb 9 10:42:50 EST 2007


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 at lst.de>

Index: linux-2.6/arch/powerpc/platforms/cell/spufs/sched.c
===================================================================
--- linux-2.6.orig/arch/powerpc/platforms/cell/spufs/sched.c	2007-02-05 12:36:22.000000000 +0100
+++ linux-2.6/arch/powerpc/platforms/cell/spufs/sched.c	2007-02-05 12:47:14.000000000 +0100
@@ -83,27 +83,14 @@
 /**
  * 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 @@
  * 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 @@
 	ctx->spu = NULL;
 	spu->flags = 0;
 	spu->ctx = NULL;
-
-	return was_active;
 }
 
 /**
@@ -340,17 +322,21 @@
 	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)



More information about the cbe-oss-dev mailing list