Generally, irq_create_affinity_masks() assign default affinity to pre/ post vectors correctly. However, it ignore the case that there are only pre/post vectors (when nvecs == affd->pre_vectors + affd->post_vectors) and return NULL. This case usually happens when nvecs = 1 (e.g. in nvme driver when MSI-X is unavailable and fallback to MSI) and will trigger the warning in pci_irq_get_affinity(). This patch fix the corner case. Fixes: 6f9a22bc5775d231ab8f ("PCI/MSI: Ignore affinity if pre/post vector count is more than min_vecs") Cc: stable@xxxxxxxxxxxxxxx Cc: Christoph Hellwig <hch@xxxxxx> Cc: Michael Hernandez <michael.hernandez@xxxxxxxxxx> Signed-off-by: Huacai Chen <chenhc@xxxxxxxxxx> --- kernel/irq/affinity.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/kernel/irq/affinity.c b/kernel/irq/affinity.c index 45b68b4..9b766eb 100644 --- a/kernel/irq/affinity.c +++ b/kernel/irq/affinity.c @@ -240,13 +240,6 @@ irq_create_affinity_masks(int nvecs, const struct irq_affinity *affd) struct irq_affinity_desc *masks = NULL; int i, nr_sets; - /* - * If there aren't any vectors left after applying the pre/post - * vectors don't bother with assigning affinity. - */ - if (nvecs == affd->pre_vectors + affd->post_vectors) - return NULL; - node_to_cpumask = alloc_node_to_cpumask(); if (!node_to_cpumask) return NULL; @@ -255,6 +248,17 @@ irq_create_affinity_masks(int nvecs, const struct irq_affinity *affd) if (!masks) goto outnodemsk; + /* + * If there aren't any vectors left after applying the pre/post + * vectors then just assign the default affinity to all vectors. + */ + if (nvecs == affd->pre_vectors + affd->post_vectors) { + /* Fill all vectors that don't need affinity */ + for (curvec = 0; curvec < nvecs; curvec++) + cpumask_copy(&masks[curvec].mask, irq_default_affinity); + goto outnodemsk; + } + /* Fill out vectors at the beginning that don't need affinity */ for (curvec = 0; curvec < affd->pre_vectors; curvec++) cpumask_copy(&masks[curvec].mask, irq_default_affinity); -- 2.7.0