RE: [PATCH] hpsa: switch to pci_alloc_irq_vectors

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

 



> -----Original Message-----
> From: Hannes Reinecke [mailto:hare@xxxxxxx]
> Sent: Tuesday, November 08, 2016 1:12 AM
> To: Martin K. Petersen
> Cc: Christoph Hellwig; James Bottomley; linux-scsi@xxxxxxxxxxxxxxx; Hannes
> Reinecke; Hannes Reinecke; Don Brace
> Subject: [PATCH] hpsa: switch to pci_alloc_irq_vectors
> 
> EXTERNAL EMAIL
> 
> 
> Use pci_alloc_irq_vectors and drop the hand-crafted
> interrupt affinity routines.
> 
> Signed-off-by: Hannes Reinecke <hare@xxxxxxxx>
> Cc: Don Brace <don.brace@xxxxxxxxxxxxx>

Do we need to add an entry for map_queues?

Are you and Christoph still working on this patch? :)

Thanks,
Don Brace

ESC - Smart Storage
Microsemi Corporation




> ---
>  drivers/scsi/hpsa.c | 72 +++++++++++++++++++----------------------------------
>  drivers/scsi/hpsa.h |  1 -
>  2 files changed, 26 insertions(+), 47 deletions(-)
> 
> diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
> index 4e82b69..104e699 100644
> --- a/drivers/scsi/hpsa.c
> +++ b/drivers/scsi/hpsa.c
> @@ -5618,7 +5618,7 @@ static int hpsa_scsi_host_alloc(struct ctlr_info *h)
>         sh->sg_tablesize = h->maxsgentries;
>         sh->transportt = hpsa_sas_transport_template;
>         sh->hostdata[0] = (unsigned long) h;
> -       sh->irq = h->intr[h->intr_mode];
> +       sh->irq = pci_irq_vector(h->pdev, h->intr_mode);
>         sh->unique_id = sh->irq;
> 
>         h->scsi_host = sh;
> @@ -7667,14 +7667,9 @@ static void hpsa_disable_interrupt_mode(struct
> ctlr_info *h)
>   */
>  static void hpsa_interrupt_mode(struct ctlr_info *h)
>  {
> +       unsigned int irq_flags = PCI_IRQ_LEGACY;
>  #ifdef CONFIG_PCI_MSI
> -       int err, i;
> -       struct msix_entry hpsa_msix_entries[MAX_REPLY_QUEUES];
> -
> -       for (i = 0; i < MAX_REPLY_QUEUES; i++) {
> -               hpsa_msix_entries[i].vector = 0;
> -               hpsa_msix_entries[i].entry = i;
> -       }
> +       int err;
> 
>         /* Some boards advertise MSI but don't really support it */
>         if ((h->board_id == 0x40700E11) || (h->board_id == 0x40800E11) ||
> @@ -7685,8 +7680,8 @@ static void hpsa_interrupt_mode(struct ctlr_info
> *h)
>                 h->msix_vector = MAX_REPLY_QUEUES;
>                 if (h->msix_vector > num_online_cpus())
>                         h->msix_vector = num_online_cpus();
> -               err = pci_enable_msix_range(h->pdev, hpsa_msix_entries,
> -                                           1, h->msix_vector);
> +               err = pci_alloc_irq_vectors(h->pdev, 1, h->msix_vector,
> +                                           PCI_IRQ_MSIX | PCI_IRQ_AFFINITY);
>                 if (err < 0) {
>                         dev_warn(&h->pdev->dev, "MSI-X init failed %d\n", err);
>                         h->msix_vector = 0;
> @@ -7696,22 +7691,21 @@ static void hpsa_interrupt_mode(struct ctlr_info
> *h)
>                                "available\n", err);
>                 }
>                 h->msix_vector = err;
> -               for (i = 0; i < h->msix_vector; i++)
> -                       h->intr[i] = hpsa_msix_entries[i].vector;
>                 return;
>         }
>  single_msi_mode:
>         if (pci_find_capability(h->pdev, PCI_CAP_ID_MSI)) {
>                 dev_info(&h->pdev->dev, "MSI capable controller\n");
> -               if (!pci_enable_msi(h->pdev))
> +               if (!pci_enable_msi(h->pdev)) {
>                         h->msi_vector = 1;
> -               else
> +                       irq_flags = PCI_IRQ_MSI;
> +               } else
>                         dev_warn(&h->pdev->dev, "MSI init failed\n");
>         }
>  default_int_mode:
>  #endif                         /* CONFIG_PCI_MSI */
>         /* if we get here we're going to use the default interrupt mode */
> -       h->intr[h->intr_mode] = h->pdev->irq;
> +       pci_alloc_irq_vectors(h->pdev, 1, 1, irq_flags);
>  }
> 
>  static int hpsa_lookup_board_id(struct pci_dev *pdev, u32 *board_id)
> @@ -8236,17 +8230,6 @@ static int hpsa_alloc_cmd_pool(struct ctlr_info *h)
>         return -ENOMEM;
>  }
> 
> -static void hpsa_irq_affinity_hints(struct ctlr_info *h)
> -{
> -       int i, cpu;
> -
> -       cpu = cpumask_first(cpu_online_mask);
> -       for (i = 0; i < h->msix_vector; i++) {
> -               irq_set_affinity_hint(h->intr[i], get_cpu_mask(cpu));
> -               cpu = cpumask_next(cpu, cpu_online_mask);
> -       }
> -}
> -
>  /* clear affinity hints and free MSI-X, MSI, or legacy INTx vectors */
>  static void hpsa_free_irqs(struct ctlr_info *h)
>  {
> @@ -8255,15 +8238,13 @@ static void hpsa_free_irqs(struct ctlr_info *h)
>         if (!h->msix_vector || h->intr_mode != PERF_MODE_INT) {
>                 /* Single reply queue, only one irq to free */
>                 i = h->intr_mode;
> -               irq_set_affinity_hint(h->intr[i], NULL);
> -               free_irq(h->intr[i], &h->q[i]);
> +               free_irq(pci_irq_vector(h->pdev, i), &h->q[i]);
>                 h->q[i] = 0;
>                 return;
>         }
> 
>         for (i = 0; i < h->msix_vector; i++) {
> -               irq_set_affinity_hint(h->intr[i], NULL);
> -               free_irq(h->intr[i], &h->q[i]);
> +               free_irq(pci_irq_vector(h->pdev, i), &h->q[i]);
>                 h->q[i] = 0;
>         }
>         for (; i < MAX_REPLY_QUEUES; i++)
> @@ -8288,17 +8269,18 @@ static int hpsa_request_irqs(struct ctlr_info *h,
>                 /* If performant mode and MSI-X, use multiple reply queues */
>                 for (i = 0; i < h->msix_vector; i++) {
>                         sprintf(h->intrname[i], "%s-msix%d", h->devname, i);
> -                       rc = request_irq(h->intr[i], msixhandler,
> -                                       0, h->intrname[i],
> -                                       &h->q[i]);
> +                       rc = request_irq(pci_irq_vector(h->pdev, i),
> +                                        msixhandler, 0, h->intrname[i],
> +                                        &h->q[i]);
>                         if (rc) {
>                                 int j;
> 
>                                 dev_err(&h->pdev->dev,
>                                         "failed to get irq %d for %s\n",
> -                                      h->intr[i], h->devname);
> +                                       pci_irq_vector(h->pdev, i), h->devname);
>                                 for (j = 0; j < i; j++) {
> -                                       free_irq(h->intr[j], &h->q[j]);
> +                                       free_irq(pci_irq_vector(h->pdev, i),
> +                                                &h->q[j]);
>                                         h->q[j] = 0;
>                                 }
>                                 for (; j < MAX_REPLY_QUEUES; j++)
> @@ -8306,7 +8288,6 @@ static int hpsa_request_irqs(struct ctlr_info *h,
>                                 return rc;
>                         }
>                 }
> -               hpsa_irq_affinity_hints(h);
>         } else {
>                 /* Use single reply pool */
>                 if (h->msix_vector > 0 || h->msi_vector) {
> @@ -8316,23 +8297,22 @@ static int hpsa_request_irqs(struct ctlr_info *h,
>                         else
>                                 sprintf(h->intrname[h->intr_mode],
>                                         "%s-msi", h->devname);
> -                       rc = request_irq(h->intr[h->intr_mode],
> -                               msixhandler, 0,
> -                               h->intrname[h->intr_mode],
> -                               &h->q[h->intr_mode]);
> +                       rc = request_irq(pci_irq_vector(h->pdev, h->intr_mode),
> +                                        msixhandler, 0,
> +                                        h->intrname[h->intr_mode],
> +                                        &h->q[h->intr_mode]);
>                 } else {
>                         sprintf(h->intrname[h->intr_mode],
>                                 "%s-intx", h->devname);
> -                       rc = request_irq(h->intr[h->intr_mode],
> -                               intxhandler, IRQF_SHARED,
> -                               h->intrname[h->intr_mode],
> -                               &h->q[h->intr_mode]);
> +                       rc = request_irq(pci_irq_vector(h->pdev, h->intr_mode),
> +                                        intxhandler, IRQF_SHARED,
> +                                        h->intrname[h->intr_mode],
> +                                        &h->q[h->intr_mode]);
>                 }
> -               irq_set_affinity_hint(h->intr[h->intr_mode], NULL);
>         }
>         if (rc) {
>                 dev_err(&h->pdev->dev, "failed to get irq %d for %s\n",
> -                      h->intr[h->intr_mode], h->devname);
> +                       pci_irq_vector(h->pdev, h->intr_mode), h->devname);
>                 hpsa_free_irqs(h);
>                 return -ENODEV;
>         }
> diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h
> index 82cdfad..a10a24c 100644
> --- a/drivers/scsi/hpsa.h
> +++ b/drivers/scsi/hpsa.h
> @@ -175,7 +175,6 @@ struct ctlr_info {
>  #      define DOORBELL_INT     1
>  #      define SIMPLE_MODE_INT  2
>  #      define MEMQ_MODE_INT    3
> -       unsigned int intr[MAX_REPLY_QUEUES];
>         unsigned int msix_vector;
>         unsigned int msi_vector;
>         int intr_mode; /* either PERF_MODE_INT or SIMPLE_MODE_INT */
> --
> 1.8.5.6

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux