浏览代码

[CELL] spufs: integration of SPE affinity with the scheduller

This patch makes the scheduller honor affinity information for each
context being scheduled. If the context has no affinity information,
behaviour is unchanged. If there are affinity information, context is
schedulled to be run on the exact spu recommended by the affinity
placement algorithm.

Signed-off-by: Andre Detsch <adetsch@br.ibm.com>
Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>
Arnd Bergmann 18 年之前
父节点
当前提交
cbc23d3e7c
共有 2 个文件被更改,包括 23 次插入0 次删除
  1. 19 0
      arch/powerpc/platforms/cell/spu_base.c
  2. 4 0
      arch/powerpc/platforms/cell/spufs/sched.c

+ 19 - 0
arch/powerpc/platforms/cell/spu_base.c

@@ -425,6 +425,25 @@ static void spu_init_channels(struct spu *spu)
 	}
 }
 
+struct spu *spu_alloc_spu(struct spu *req_spu)
+{
+	struct spu *spu, *ret = NULL;
+
+	mutex_lock(&spu_mutex);
+	list_for_each_entry(spu, &cbe_spu_info[req_spu->node].free_spus, list) {
+		if (spu == req_spu) {
+			list_del_init(&spu->list);
+			pr_debug("Got SPU %d %d\n", spu->number, spu->node);
+			spu_init_channels(spu);
+			ret = spu;
+			break;
+		}
+	}
+	mutex_unlock(&spu_mutex);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(spu_alloc_spu);
+
 struct spu *spu_alloc_node(int node)
 {
 	struct spu *spu = NULL;

+ 4 - 0
arch/powerpc/platforms/cell/spufs/sched.c

@@ -507,6 +507,10 @@ static struct spu *spu_get_idle(struct spu_context *ctx)
 	int node = cpu_to_node(raw_smp_processor_id());
 	int n;
 
+	spu = affinity_check(ctx);
+	if (spu)
+		return spu_alloc_spu(spu);
+
 	for (n = 0; n < MAX_NUMNODES; n++, node++) {
 		node = (node < MAX_NUMNODES) ? node : 0;
 		if (!node_allowed(ctx, node))