]> Git Repo - linux.git/blobdiff - kernel/irq/matrix.c
KVM: X86: TSCDEADLINE MSR emulation fastpath
[linux.git] / kernel / irq / matrix.c
index 1f0985adf19340fdb9ec02cf9118c035d8f8e346..30cc217b863184989987f2fa76c76c8bc9a082b4 100644 (file)
@@ -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();
This page took 0.038203 seconds and 4 git commands to generate.