|
|
@@ -14,6 +14,7 @@ struct cpumap {
|
|
|
unsigned int available;
|
|
|
unsigned int allocated;
|
|
|
unsigned int managed;
|
|
|
+ unsigned int managed_allocated;
|
|
|
bool initialized;
|
|
|
bool online;
|
|
|
unsigned long alloc_map[IRQ_MATRIX_SIZE];
|
|
|
@@ -145,6 +146,27 @@ static unsigned int matrix_find_best_cpu(struct irq_matrix *m,
|
|
|
return best_cpu;
|
|
|
}
|
|
|
|
|
|
+/* Find the best CPU which has the lowest number of managed IRQs allocated */
|
|
|
+static unsigned int matrix_find_best_cpu_managed(struct irq_matrix *m,
|
|
|
+ const struct cpumask *msk)
|
|
|
+{
|
|
|
+ unsigned int cpu, best_cpu, allocated = UINT_MAX;
|
|
|
+ struct cpumap *cm;
|
|
|
+
|
|
|
+ best_cpu = UINT_MAX;
|
|
|
+
|
|
|
+ for_each_cpu(cpu, msk) {
|
|
|
+ cm = per_cpu_ptr(m->maps, cpu);
|
|
|
+
|
|
|
+ if (!cm->online || cm->managed_allocated > allocated)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ best_cpu = cpu;
|
|
|
+ allocated = cm->managed_allocated;
|
|
|
+ }
|
|
|
+ return best_cpu;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* irq_matrix_assign_system - Assign system wide entry in the matrix
|
|
|
* @m: Matrix pointer
|
|
|
@@ -269,7 +291,7 @@ int irq_matrix_alloc_managed(struct irq_matrix *m, const struct cpumask *msk,
|
|
|
if (cpumask_empty(msk))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- cpu = matrix_find_best_cpu(m, msk);
|
|
|
+ cpu = matrix_find_best_cpu_managed(m, msk);
|
|
|
if (cpu == UINT_MAX)
|
|
|
return -ENOSPC;
|
|
|
|
|
|
@@ -282,6 +304,7 @@ int irq_matrix_alloc_managed(struct irq_matrix *m, const struct cpumask *msk,
|
|
|
return -ENOSPC;
|
|
|
set_bit(bit, cm->alloc_map);
|
|
|
cm->allocated++;
|
|
|
+ cm->managed_allocated++;
|
|
|
m->total_allocated++;
|
|
|
*mapped_cpu = cpu;
|
|
|
trace_irq_matrix_alloc_managed(bit, cpu, m, cm);
|
|
|
@@ -395,6 +418,8 @@ void irq_matrix_free(struct irq_matrix *m, unsigned int cpu,
|
|
|
|
|
|
clear_bit(bit, cm->alloc_map);
|
|
|
cm->allocated--;
|
|
|
+ if(managed)
|
|
|
+ cm->managed_allocated--;
|
|
|
|
|
|
if (cm->online)
|
|
|
m->total_allocated--;
|
|
|
@@ -464,13 +489,14 @@ void irq_matrix_debug_show(struct seq_file *sf, struct irq_matrix *m, int ind)
|
|
|
seq_printf(sf, "Total allocated: %6u\n", m->total_allocated);
|
|
|
seq_printf(sf, "System: %u: %*pbl\n", nsys, m->matrix_bits,
|
|
|
m->system_map);
|
|
|
- seq_printf(sf, "%*s| CPU | avl | man | act | vectors\n", ind, " ");
|
|
|
+ seq_printf(sf, "%*s| CPU | avl | man | mac | act | vectors\n", ind, " ");
|
|
|
cpus_read_lock();
|
|
|
for_each_online_cpu(cpu) {
|
|
|
struct cpumap *cm = per_cpu_ptr(m->maps, cpu);
|
|
|
|
|
|
- seq_printf(sf, "%*s %4d %4u %4u %4u %*pbl\n", ind, " ",
|
|
|
- cpu, cm->available, cm->managed, cm->allocated,
|
|
|
+ seq_printf(sf, "%*s %4d %4u %4u %4u %4u %*pbl\n", ind, " ",
|
|
|
+ cpu, cm->available, cm->managed,
|
|
|
+ cm->managed_allocated, cm->allocated,
|
|
|
m->matrix_bits, cm->alloc_map);
|
|
|
}
|
|
|
cpus_read_unlock();
|