From: David Woodhouse Date: Tue, 6 Oct 2020 11:09:19 +0000 (+0100) Subject: genirq: Ensure affinity masks include one present CPU for each vector X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=50052ed99db8e1ad9b29a5ec79d901b08deef435;p=users%2Fdwmw2%2Flinux.git genirq: Ensure affinity masks include one present CPU for each vector Where allocating more MSI-X vectors for a device than there are CPUs in the system, irq_build_affinity_masks() will end up creating affinities for some vectors which don't include *any* present CPUs. Make it try harder to assign at least one present CPU to each vector. Signed-off-by: David Woodhouse --- diff --git a/kernel/irq/affinity.c b/kernel/irq/affinity.c index 3fba9220fea65..a53c4e6f04345 100644 --- a/kernel/irq/affinity.c +++ b/kernel/irq/affinity.c @@ -364,12 +364,17 @@ static int irq_build_affinity_masks(unsigned int startvec, unsigned int numvecs, cpumask_copy(npresmsk, cpu_present_mask); /* Spread on present CPUs starting from affd->pre_vectors */ - ret = __irq_build_affinity_masks(curvec, numvecs, firstvec, - node_to_cpumask, cpu_present_mask, - nmsk, masks); - if (ret < 0) - goto fail_build_affinity; - nr_present = ret; + while (nr_present < numvecs) { + curvec = firstvec + nr_present; + ret = __irq_build_affinity_masks(curvec, numvecs, firstvec, + node_to_cpumask, npresmsk, + nmsk, masks); + if (ret < 0) + goto fail_build_affinity; + if (!ret) + break; + nr_present += ret; + } /* * Spread on non present CPUs starting from the next vector to be