diff options
-rw-r--r-- | kernel/irq/matrix.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/kernel/irq/matrix.c b/kernel/irq/matrix.c index 0ba0dd8863a7..5187dfe809ac 100644 --- a/kernel/irq/matrix.c +++ b/kernel/irq/matrix.c | |||
@@ -321,15 +321,23 @@ void irq_matrix_remove_reserved(struct irq_matrix *m) | |||
321 | int irq_matrix_alloc(struct irq_matrix *m, const struct cpumask *msk, | 321 | int irq_matrix_alloc(struct irq_matrix *m, const struct cpumask *msk, |
322 | bool reserved, unsigned int *mapped_cpu) | 322 | bool reserved, unsigned int *mapped_cpu) |
323 | { | 323 | { |
324 | unsigned int cpu; | 324 | unsigned int cpu, best_cpu, maxavl = 0; |
325 | struct cpumap *cm; | ||
326 | unsigned int bit; | ||
325 | 327 | ||
328 | best_cpu = UINT_MAX; | ||
326 | for_each_cpu(cpu, msk) { | 329 | for_each_cpu(cpu, msk) { |
327 | struct cpumap *cm = per_cpu_ptr(m->maps, cpu); | 330 | cm = per_cpu_ptr(m->maps, cpu); |
328 | unsigned int bit; | ||
329 | 331 | ||
330 | if (!cm->online) | 332 | if (!cm->online || cm->available <= maxavl) |
331 | continue; | 333 | continue; |
332 | 334 | ||
335 | best_cpu = cpu; | ||
336 | maxavl = cm->available; | ||
337 | } | ||
338 | |||
339 | if (maxavl) { | ||
340 | cm = per_cpu_ptr(m->maps, best_cpu); | ||
333 | bit = matrix_alloc_area(m, cm, 1, false); | 341 | bit = matrix_alloc_area(m, cm, 1, false); |
334 | if (bit < m->alloc_end) { | 342 | if (bit < m->alloc_end) { |
335 | cm->allocated++; | 343 | cm->allocated++; |
@@ -338,8 +346,8 @@ int irq_matrix_alloc(struct irq_matrix *m, const struct cpumask *msk, | |||
338 | m->global_available--; | 346 | m->global_available--; |
339 | if (reserved) | 347 | if (reserved) |
340 | m->global_reserved--; | 348 | m->global_reserved--; |
341 | *mapped_cpu = cpu; | 349 | *mapped_cpu = best_cpu; |
342 | trace_irq_matrix_alloc(bit, cpu, m, cm); | 350 | trace_irq_matrix_alloc(bit, best_cpu, m, cm); |
343 | return bit; | 351 | return bit; |
344 | } | 352 | } |
345 | } | 353 | } |