Message ID | 20190805011906.5020-1-ming.lei@redhat.com (mailing list archive) |
---|---|
State | Mainlined, archived |
Commit | 491beed3b102b6e6c0e7734200661242226e3933 |
Headers | show |
Series | genirq/affinity: create affinity mask for single vector | expand |
Hello Thomas and Guys, On Mon, Aug 5, 2019 at 9:19 AM Ming Lei <ming.lei@redhat.com> wrote: > > Since commit c66d4bd110a1f8 ("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 may be triggered in some generic cases: > 1) kdump kernel 2) irq vectors resource is close to exhaustion. > > If we don't create affinity mask for single vector, almost every caller > has to handle the special case. > > So still create affinity mask for single vector, since irq_create_affinity_masks() > is capable of handling that. > > Cc: Marc Zyngier <marc.zyngier@arm.com> > Cc: Christoph Hellwig <hch@lst.de> > Cc: Bjorn Helgaas <helgaas@kernel.org> > Cc: Jens Axboe <axboe@kernel.dk> > Cc: linux-block@vger.kernel.org > Cc: Sagi Grimberg <sagi@grimberg.me> > Cc: linux-nvme@lists.infradead.org > Cc: linux-pci@vger.kernel.org > Cc: Keith Busch <keith.busch@intel.com> > Cc: Sumit Saxena <sumit.saxena@broadcom.com> > Cc: Kashyap Desai <kashyap.desai@broadcom.com> > Cc: Shivasharan Srikanteshwara <shivasharan.srikanteshwara@broadcom.com> > Fixes: c66d4bd110a1f8 ("genirq/affinity: Add new callback for (re)calculating interrupt sets") > Signed-off-by: Ming Lei <ming.lei@redhat.com> > --- > kernel/irq/affinity.c | 6 ++---- > 1 file changed, 2 insertions(+), 4 deletions(-) > > diff --git a/kernel/irq/affinity.c b/kernel/irq/affinity.c > index 4352b08ae48d..6fef48033f96 100644 > --- a/kernel/irq/affinity.c > +++ b/kernel/irq/affinity.c > @@ -251,11 +251,9 @@ irq_create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd) > * Determine the number of vectors which need interrupt affinities > * assigned. If the pre/post request exhausts the available vectors > * then nothing to do here except for invoking the calc_sets() > - * callback so the device driver can adjust to the situation. If there > - * is only a single vector, then managing the queue is pointless as > - * well. > + * callback so the device driver can adjust to the situation. > */ > - 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; > else > affvecs = 0; Without this patch, kdump kernel may not work, so could you take a look at this patch? Thanks, Ming Lei
On Mon, Aug 05, 2019 at 09:19:06AM +0800, Ming Lei wrote: > Since commit c66d4bd110a1f8 ("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 may be triggered in some generic cases: > 1) kdump kernel 2) irq vectors resource is close to exhaustion. > > If we don't create affinity mask for single vector, almost every caller > has to handle the special case. > > So still create affinity mask for single vector, since irq_create_affinity_masks() > is capable of handling that. Hi Ming, Looks good to me. Reviewed-by: Keith Busch <keith.busch@intel.com> > --- > kernel/irq/affinity.c | 6 ++---- > 1 file changed, 2 insertions(+), 4 deletions(-) > > diff --git a/kernel/irq/affinity.c b/kernel/irq/affinity.c > index 4352b08ae48d..6fef48033f96 100644 > --- a/kernel/irq/affinity.c > +++ b/kernel/irq/affinity.c > @@ -251,11 +251,9 @@ irq_create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd) > * Determine the number of vectors which need interrupt affinities > * assigned. If the pre/post request exhausts the available vectors > * then nothing to do here except for invoking the calc_sets() > - * callback so the device driver can adjust to the situation. If there > - * is only a single vector, then managing the queue is pointless as > - * well. > + * callback so the device driver can adjust to the situation. > */ > - 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; > else > affvecs = 0; > --
diff --git a/kernel/irq/affinity.c b/kernel/irq/affinity.c index 4352b08ae48d..6fef48033f96 100644 --- a/kernel/irq/affinity.c +++ b/kernel/irq/affinity.c @@ -251,11 +251,9 @@ irq_create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd) * Determine the number of vectors which need interrupt affinities * assigned. If the pre/post request exhausts the available vectors * then nothing to do here except for invoking the calc_sets() - * callback so the device driver can adjust to the situation. If there - * is only a single vector, then managing the queue is pointless as - * well. + * callback so the device driver can adjust to the situation. */ - 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; else affvecs = 0;
Since commit c66d4bd110a1f8 ("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 may be triggered in some generic cases: 1) kdump kernel 2) irq vectors resource is close to exhaustion. If we don't create affinity mask for single vector, almost every caller has to handle the special case. So still create affinity mask for single vector, since irq_create_affinity_masks() is capable of handling that. Cc: Marc Zyngier <marc.zyngier@arm.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Bjorn Helgaas <helgaas@kernel.org> Cc: Jens Axboe <axboe@kernel.dk> Cc: linux-block@vger.kernel.org Cc: Sagi Grimberg <sagi@grimberg.me> Cc: linux-nvme@lists.infradead.org Cc: linux-pci@vger.kernel.org Cc: Keith Busch <keith.busch@intel.com> Cc: Sumit Saxena <sumit.saxena@broadcom.com> Cc: Kashyap Desai <kashyap.desai@broadcom.com> Cc: Shivasharan Srikanteshwara <shivasharan.srikanteshwara@broadcom.com> Fixes: c66d4bd110a1f8 ("genirq/affinity: Add new callback for (re)calculating interrupt sets") Signed-off-by: Ming Lei <ming.lei@redhat.com> --- kernel/irq/affinity.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)