From 0e00bd24d99ac6f14f50b9d2c56551c63926b0e4 Mon Sep 17 00:00:00 2001 From: Arnd Bergmann Date: Fri, 20 Jul 2007 21:39:49 +0200 Subject: [PATCH] --- yaml --- r: 62258 b: refs/heads/master c: cbc23d3e7cb3c9fd3c9fce0bc3f44f687a9517c0 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/powerpc/platforms/cell/spu_base.c | 19 +++++++++++++++++++ .../arch/powerpc/platforms/cell/spufs/sched.c | 4 ++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 2bf295167ec8..4128a6eab4a1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c5fc8d2a92461fcabd00dfd678204cba36b93119 +refs/heads/master: cbc23d3e7cb3c9fd3c9fce0bc3f44f687a9517c0 diff --git a/trunk/arch/powerpc/platforms/cell/spu_base.c b/trunk/arch/powerpc/platforms/cell/spu_base.c index 75b5af0a7e21..5f399313b472 100644 --- a/trunk/arch/powerpc/platforms/cell/spu_base.c +++ b/trunk/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; diff --git a/trunk/arch/powerpc/platforms/cell/spufs/sched.c b/trunk/arch/powerpc/platforms/cell/spufs/sched.c index a9569de4c141..49b8f6867a96 100644 --- a/trunk/arch/powerpc/platforms/cell/spufs/sched.c +++ b/trunk/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))