Re: [PATCH 8/8] scsi: pm8001: take blk_mq_max_nr_hw_queues() into account for calculating io vectors

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
>




[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux