On Wed, Jul 12, 2023 at 2:55 PM Ming Lei <ming.lei@xxxxxxxxxx> wrote: > > Take blk-mq's knowledge into account for calculating io queues. > > Fix wrong queue mapping in case of kdump kernel. > > On arm and ppc64, 'maxcpus=1' is passed to kdump kernel command line, > see `Documentation/admin-guide/kdump/kdump.rst`, so num_possible_cpus() > still returns all CPUs because 'maxcpus=1' just bring up one single > cpu core during booting. > > blk-mq sees single queue in kdump kernel, and in driver's viewpoint > there are still multiple queues, this inconsistency causes driver to apply > wrong queue mapping for handling IO, and IO timeout is triggered. > > Meantime, single queue makes much less resource utilization, and reduce > risk of kernel failure. > > Cc: Jack Wang <jinpu.wang@xxxxxxxxxxxxxxx> > Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx> Acked-by: Jack Wang <jinpu.wang@xxxxxxxxx> thx! > --- > drivers/scsi/pm8001/pm8001_init.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c > index 2e886c1d867d..e2416f556560 100644 > --- a/drivers/scsi/pm8001/pm8001_init.c > +++ b/drivers/scsi/pm8001/pm8001_init.c > @@ -965,6 +965,8 @@ static u32 pm8001_setup_msix(struct pm8001_hba_info *pm8001_ha) > rc = pci_alloc_irq_vectors(pm8001_ha->pdev, 1, 1, > PCI_IRQ_MSIX); > } else { > + unsigned int max_vecs = min_t(unsigned int, PM8001_MAX_MSIX_VEC, > + blk_mq_max_nr_hw_queues() + 1); > /* > * Queue index #0 is used always for housekeeping, so don't > * include in the affinity spreading. > @@ -973,7 +975,7 @@ static u32 pm8001_setup_msix(struct pm8001_hba_info *pm8001_ha) > .pre_vectors = 1, > }; > rc = pci_alloc_irq_vectors_affinity( > - pm8001_ha->pdev, 2, PM8001_MAX_MSIX_VEC, > + pm8001_ha->pdev, 2, max_vecs, > PCI_IRQ_MSIX | PCI_IRQ_AFFINITY, &desc); > } > > -- > 2.40.1 >