diff options
Diffstat (limited to 'kernel/irq/matrix.c')
-rw-r--r-- | kernel/irq/matrix.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/kernel/irq/matrix.c b/kernel/irq/matrix.c index 7df2480005f8..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 | } |
@@ -384,7 +392,9 @@ unsigned int irq_matrix_available(struct irq_matrix *m, bool cpudown) | |||
384 | { | 392 | { |
385 | struct cpumap *cm = this_cpu_ptr(m->maps); | 393 | struct cpumap *cm = this_cpu_ptr(m->maps); |
386 | 394 | ||
387 | return (m->global_available - cpudown) ? cm->available : 0; | 395 | if (!cpudown) |
396 | return m->global_available; | ||
397 | return m->global_available - cm->available; | ||
388 | } | 398 | } |
389 | 399 | ||
390 | /** | 400 | /** |