diff options
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); |