diff options
author | Andre Detsch <adetsch@br.ibm.com> | 2008-07-23 21:01:54 -0400 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2008-07-23 21:01:54 -0400 |
commit | ad1ede127760d6ca4903f44dfe1a8a38b3bfb36c (patch) | |
tree | eee2926eecc05d7cc22edda1535e9b9b03b9a401 /arch | |
parent | 0855b543222e79cbbd9d66dd56cb54740e7d524f (diff) |
powerpc/spufs: better placement of spu affinity reference context
This patch adjusts the placement of a reference context from
a spu affinity chain. The reference context can now be placed
only on nodes that have enough spus not intended to be used by
another gang (already running on the node).
Signed-off-by: Andre Detsch <adetsch@br.ibm.com>
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/platforms/cell/spufs/sched.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index f293963cd855..2deeeba7eccf 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c | |||
@@ -312,11 +312,28 @@ static struct spu *aff_ref_location(struct spu_context *ctx, int mem_aff, | |||
312 | */ | 312 | */ |
313 | node = cpu_to_node(raw_smp_processor_id()); | 313 | node = cpu_to_node(raw_smp_processor_id()); |
314 | for (n = 0; n < MAX_NUMNODES; n++, node++) { | 314 | for (n = 0; n < MAX_NUMNODES; n++, node++) { |
315 | int available_spus; | ||
316 | |||
315 | node = (node < MAX_NUMNODES) ? node : 0; | 317 | node = (node < MAX_NUMNODES) ? node : 0; |
316 | if (!node_allowed(ctx, node)) | 318 | if (!node_allowed(ctx, node)) |
317 | continue; | 319 | continue; |
320 | |||
321 | available_spus = 0; | ||
318 | mutex_lock(&cbe_spu_info[node].list_mutex); | 322 | mutex_lock(&cbe_spu_info[node].list_mutex); |
319 | list_for_each_entry(spu, &cbe_spu_info[node].spus, cbe_list) { | 323 | list_for_each_entry(spu, &cbe_spu_info[node].spus, cbe_list) { |
324 | if (spu->ctx && spu->ctx->gang | ||
325 | && spu->ctx->aff_offset == 0) | ||
326 | available_spus -= | ||
327 | (spu->ctx->gang->contexts - 1); | ||
328 | else | ||
329 | available_spus++; | ||
330 | } | ||
331 | if (available_spus < ctx->gang->contexts) { | ||
332 | mutex_unlock(&cbe_spu_info[node].list_mutex); | ||
333 | continue; | ||
334 | } | ||
335 | |||
336 | list_for_each_entry(spu, &cbe_spu_info[node].spus, cbe_list) { | ||
320 | if ((!mem_aff || spu->has_mem_affinity) && | 337 | if ((!mem_aff || spu->has_mem_affinity) && |
321 | sched_spu(spu)) { | 338 | sched_spu(spu)) { |
322 | mutex_unlock(&cbe_spu_info[node].list_mutex); | 339 | mutex_unlock(&cbe_spu_info[node].list_mutex); |