summaryrefslogtreecommitdiffstats
path: root/kernel/irq/matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/irq/matrix.c')
-rw-r--r--kernel/irq/matrix.c17
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 */
263int irq_matrix_alloc_managed(struct irq_matrix *m, unsigned int cpu) 263int 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}