diff options
Diffstat (limited to 'kernel/irq/matrix.c')
-rw-r--r-- | kernel/irq/matrix.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/kernel/irq/matrix.c b/kernel/irq/matrix.c index 67768bbe736e..6e6d467f3dec 100644 --- a/kernel/irq/matrix.c +++ b/kernel/irq/matrix.c | |||
@@ -260,11 +260,21 @@ void irq_matrix_remove_managed(struct irq_matrix *m, const struct cpumask *msk) | |||
260 | * @m: Matrix pointer | 260 | * @m: Matrix pointer |
261 | * @cpu: On which CPU the interrupt should be allocated | 261 | * @cpu: On which CPU the interrupt should be allocated |
262 | */ | 262 | */ |
263 | int irq_matrix_alloc_managed(struct irq_matrix *m, unsigned int cpu) | 263 | int irq_matrix_alloc_managed(struct irq_matrix *m, const struct cpumask *msk, |
264 | unsigned int *mapped_cpu) | ||
264 | { | 265 | { |
265 | struct cpumap *cm = per_cpu_ptr(m->maps, cpu); | 266 | unsigned int bit, cpu, end = m->alloc_end; |
266 | unsigned int bit, end = m->alloc_end; | 267 | struct cpumap *cm; |
268 | |||
269 | if (cpumask_empty(msk)) | ||
270 | return -EINVAL; | ||
267 | 271 | ||
272 | cpu = matrix_find_best_cpu(m, msk); | ||
273 | if (cpu == UINT_MAX) | ||
274 | return -ENOSPC; | ||
275 | |||
276 | cm = per_cpu_ptr(m->maps, cpu); | ||
277 | end = m->alloc_end; | ||
268 | /* Get managed bit which are not allocated */ | 278 | /* Get managed bit which are not allocated */ |
269 | bitmap_andnot(m->scratch_map, cm->managed_map, cm->alloc_map, end); | 279 | bitmap_andnot(m->scratch_map, cm->managed_map, cm->alloc_map, end); |
270 | bit = find_first_bit(m->scratch_map, end); | 280 | bit = find_first_bit(m->scratch_map, end); |
@@ -273,6 +283,7 @@ int irq_matrix_alloc_managed(struct irq_matrix *m, unsigned int cpu) | |||
273 | set_bit(bit, cm->alloc_map); | 283 | set_bit(bit, cm->alloc_map); |
274 | cm->allocated++; | 284 | cm->allocated++; |
275 | m->total_allocated++; | 285 | m->total_allocated++; |
286 | *mapped_cpu = cpu; | ||
276 | trace_irq_matrix_alloc_managed(bit, cpu, m, cm); | 287 | trace_irq_matrix_alloc_managed(bit, cpu, m, cm); |
277 | return bit; | 288 | return bit; |
278 | } | 289 | } |