Commit 491beed3 authored by Ming Lei's avatar Ming Lei Committed by Thomas Gleixner

genirq/affinity: Create affinity mask for single vector

Since commit c66d4bd1 ("genirq/affinity: Add new callback for
(re)calculating interrupt sets"), irq_create_affinity_masks() returns
NULL in case of single vector. This change has caused regression on some
drivers, such as lpfc.

The problem is that single vector requests can happen in some generic cases:

  1) kdump kernel

  2) irq vectors resource is close to exhaustion.

If in that situation the affinity mask for a single vector is not created,
every caller has to handle the special case.

There is no reason why the mask cannot be created, so remove the check for
a single vector and create the mask.

Fixes: c66d4bd1 ("genirq/affinity: Add new callback for (re)calculating interrupt sets")
Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: stable@vger.kernel.org
Link: https://lkml.kernel.org/r/20190805011906.5020-1-ming.lei@redhat.com
parent 33920f1e
...@@ -251,11 +251,9 @@ irq_create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd) ...@@ -251,11 +251,9 @@ irq_create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd)
* Determine the number of vectors which need interrupt affinities * Determine the number of vectors which need interrupt affinities
* assigned. If the pre/post request exhausts the available vectors * assigned. If the pre/post request exhausts the available vectors
* then nothing to do here except for invoking the calc_sets() * then nothing to do here except for invoking the calc_sets()
* callback so the device driver can adjust to the situation. If there * callback so the device driver can adjust to the situation.
* is only a single vector, then managing the queue is pointless as
* well.
*/ */
if (nvecs > 1 && nvecs > affd->pre_vectors + affd->post_vectors) if (nvecs > affd->pre_vectors + affd->post_vectors)
affvecs = nvecs - affd->pre_vectors - affd->post_vectors; affvecs = nvecs - affd->pre_vectors - affd->post_vectors;
else else
affvecs = 0; affvecs = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment