Skip to content

Commit 66f8162

Browse files
committed
Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq fix from Thomas Gleixner: "A single fix for the new matrix allocator to prevent vector exhaustion by certain network drivers which allocate gazillions of unused vectors which cannot be put into reservation mode due to MSI and the lack of MSI entry masking. The fix/workaround is to spread the vectors across CPUs by searching the supplied target CPU mask for the CPU with the smallest number of allocated vectors" * 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: irq/matrix: Spread interrupts on allocation
2 parents d517bb7 + a0c9259 commit 66f8162

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

kernel/irq/matrix.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -321,15 +321,23 @@ void irq_matrix_remove_reserved(struct irq_matrix *m)
321321
int irq_matrix_alloc(struct irq_matrix *m, const struct cpumask *msk,
322322
bool reserved, unsigned int *mapped_cpu)
323323
{
324-
unsigned int cpu;
324+
unsigned int cpu, best_cpu, maxavl = 0;
325+
struct cpumap *cm;
326+
unsigned int bit;
325327

328+
best_cpu = UINT_MAX;
326329
for_each_cpu(cpu, msk) {
327-
struct cpumap *cm = per_cpu_ptr(m->maps, cpu);
328-
unsigned int bit;
330+
cm = per_cpu_ptr(m->maps, cpu);
329331

330-
if (!cm->online)
332+
if (!cm->online || cm->available <= maxavl)
331333
continue;
332334

335+
best_cpu = cpu;
336+
maxavl = cm->available;
337+
}
338+
339+
if (maxavl) {
340+
cm = per_cpu_ptr(m->maps, best_cpu);
333341
bit = matrix_alloc_area(m, cm, 1, false);
334342
if (bit < m->alloc_end) {
335343
cm->allocated++;
@@ -338,8 +346,8 @@ int irq_matrix_alloc(struct irq_matrix *m, const struct cpumask *msk,
338346
m->global_available--;
339347
if (reserved)
340348
m->global_reserved--;
341-
*mapped_cpu = cpu;
342-
trace_irq_matrix_alloc(bit, cpu, m, cm);
349+
*mapped_cpu = best_cpu;
350+
trace_irq_matrix_alloc(bit, best_cpu, m, cm);
343351
return bit;
344352
}
345353
}

0 commit comments

Comments
 (0)