On Wed, Jun 10, 2015 at 06:42:28PM -0700, rajinikanth.panduran...@pmcs.com 
wrote:
> From: Rajinikanth Pandurangan <rajinikanth.panduran...@pmcs.com>
> 
> Description:
>         Reset irq affinity hints before releasing IRQ
>         Removed duplicate code of IRQ acquire/release
> 
> Signed-off-by: Rajinikanth Pandurangan <rajinikanth.panduran...@pmcs.com>
> ---
>  drivers/scsi/aacraid/aacraid.h |   2 +
>  drivers/scsi/aacraid/commsup.c | 113 
> ++++++++++++++++++++++++++++++-----------
>  drivers/scsi/aacraid/src.c     |  48 ++---------------
>  3 files changed, 88 insertions(+), 75 deletions(-)
> 
> diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
> index e54f597..7b95227 100644
> --- a/drivers/scsi/aacraid/aacraid.h
> +++ b/drivers/scsi/aacraid/aacraid.h
> @@ -2110,6 +2110,8 @@ static inline unsigned int cap_to_cyls(sector_t 
> capacity, unsigned divisor)
>  #define AAC_OWNER_ERROR_HANDLER      0x103
>  #define AAC_OWNER_FIRMWARE   0x106
>  
> +int aac_acquire_irq(struct aac_dev *dev);
> +void aac_free_irq(struct aac_dev *dev);
>  const char *aac_driverinfo(struct Scsi_Host *);
>  struct fib *aac_fib_alloc(struct aac_dev *dev);
>  int aac_fib_setup(struct aac_dev *dev);
> diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
> index 4da5749..a1f90fe 100644
> --- a/drivers/scsi/aacraid/commsup.c
> +++ b/drivers/scsi/aacraid/commsup.c
> @@ -1270,13 +1270,12 @@ retry_next:
>  static int _aac_reset_adapter(struct aac_dev *aac, int forced)
>  {
>       int index, quirks;
> -     int retval, i;
> +     int retval;
>       struct Scsi_Host *host;
>       struct scsi_device *dev;
>       struct scsi_cmnd *command;
>       struct scsi_cmnd *command_list;
>       int jafo = 0;
> -     int cpu;
>  
>       /*
>        * Assumptions:
> @@ -1339,35 +1338,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int 
> forced)
>       aac->comm_phys = 0;
>       kfree(aac->queues);
>       aac->queues = NULL;
> -     cpu = cpumask_first(cpu_online_mask);
> -     if (aac->pdev->device == PMC_DEVICE_S6 ||
> -         aac->pdev->device == PMC_DEVICE_S7 ||
> -         aac->pdev->device == PMC_DEVICE_S8 ||
> -         aac->pdev->device == PMC_DEVICE_S9) {
> -             if (aac->max_msix > 1) {
> -                     for (i = 0; i < aac->max_msix; i++) {
> -                             if (irq_set_affinity_hint(
> -                                 aac->msixentry[i].vector,
> -                                 NULL)) {
> -                                     printk(KERN_ERR "%s%d: Failed to reset 
> IRQ affinity for cpu %d\n",
> -                                             aac->name,
> -                                             aac->id,
> -                                             cpu);
> -                             }
> -                             cpu = cpumask_next(cpu,
> -                                             cpu_online_mask);
> -                             free_irq(aac->msixentry[i].vector,
> -                                      &(aac->aac_msix[i]));
> -                     }
> -                     pci_disable_msix(aac->pdev);
> -             } else {
> -                     free_irq(aac->pdev->irq, &(aac->aac_msix[0]));
> -             }
> -     } else {
> -             free_irq(aac->pdev->irq, aac);
> -     }
> -     if (aac->msi)
> -             pci_disable_msi(aac->pdev);
> +     aac_free_irq(aac);
>       kfree(aac->fsa_dev);
>       aac->fsa_dev = NULL;
>       quirks = aac_get_driver_ident(index)->quirks;
> @@ -1978,3 +1949,83 @@ int aac_command_thread(void *data)
>       dev->aif_thread = 0;
>       return 0;
>  }
> +
> +int aac_acquire_irq(struct aac_dev *dev)
> +{
> +     int i;
> +     int j;
> +     int ret = 0;
> +     int cpu;
> +
> +     cpu = cpumask_first(cpu_online_mask);
> +     if (!dev->sync_mode && dev->msi_enabled && dev->max_msix > 1) {
> +             for (i = 0; i < dev->max_msix; i++) {
> +                     dev->aac_msix[i].vector_no = i;
> +                     dev->aac_msix[i].dev = dev;
> +                     if (request_irq(dev->msixentry[i].vector,
> +                                     dev->a_ops.adapter_intr,
> +                                     0, "aacraid", &(dev->aac_msix[i]))) {
> +                             printk(KERN_ERR "%s%d: Failed to register IRQ 
> for vector %d.\n",
> +                                             dev->name, dev->id, i);
> +                             for (j = 0 ; j < i ; j++)
> +                                     free_irq(dev->msixentry[j].vector,
> +                                              &(dev->aac_msix[j]));
> +                             pci_disable_msix(dev->pdev);
> +                             ret = -1;
> +                     }
> +                     if (irq_set_affinity_hint(dev->msixentry[i].vector,
> +                                                     get_cpu_mask(cpu))) {
> +                             printk(KERN_ERR "%s%d: Failed to set IRQ 
> affinity for cpu %d\n",
> +                                         dev->name, dev->id, cpu);
> +                     }
> +                     cpu = cpumask_next(cpu, cpu_online_mask);
> +             }
> +     } else {
> +             dev->aac_msix[0].vector_no = 0;
> +             dev->aac_msix[0].dev = dev;
> +
> +             if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
> +                     IRQF_SHARED, "aacraid",
> +                     &(dev->aac_msix[0])) < 0) {
> +                     if (dev->msi)
> +                             pci_disable_msi(dev->pdev);
> +                     printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
> +                                     dev->name, dev->id);
> +                     ret = -1;
> +             }
> +     }
> +     return ret;
> +}
> +
> +void aac_free_irq(struct aac_dev *dev)
> +{
> +     int i;
> +     int cpu;
> +
> +     cpu = cpumask_first(cpu_online_mask);
> +     if (dev->pdev->device == PMC_DEVICE_S6 ||
> +         dev->pdev->device == PMC_DEVICE_S7 ||
> +         dev->pdev->device == PMC_DEVICE_S8 ||
> +         dev->pdev->device == PMC_DEVICE_S9) {
> +             if (dev->max_msix > 1) {
> +                     for (i = 0; i < dev->max_msix; i++) {
> +                             if (irq_set_affinity_hint(
> +                                     dev->msixentry[i].vector, NULL)) {
> +                                     printk(KERN_ERR "%s%d: Failed to reset 
> IRQ affinity for cpu %d\n",
> +                                         dev->name, dev->id, cpu);
> +                             }
> +                             cpu = cpumask_next(cpu, cpu_online_mask);
> +                             free_irq(dev->msixentry[i].vector,
> +                                             &(dev->aac_msix[i]));
> +                     }
> +             } else {
> +                     free_irq(dev->pdev->irq, &(dev->aac_msix[0]));
> +             }
> +     } else {
> +             free_irq(dev->pdev->irq, dev);
> +     }
> +     if (dev->msi)
> +             pci_disable_msi(dev->pdev);
> +     else if (dev->max_msix > 1)
> +             pci_disable_msix(dev->pdev);
> +}
> diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
> index 1409a0b..2aa34ea 100644
> --- a/drivers/scsi/aacraid/src.c
> +++ b/drivers/scsi/aacraid/src.c
> @@ -798,9 +798,7 @@ int aac_srcv_init(struct aac_dev *dev)
>       unsigned long status;
>       int restart = 0;
>       int instance = dev->id;
> -     int i, j;
>       const char *name = dev->name;
> -     int cpu;
>  
>       dev->a_ops.adapter_ioremap = aac_srcv_ioremap;
>       dev->a_ops.adapter_comm = aac_src_select_comm;
> @@ -918,48 +916,10 @@ int aac_srcv_init(struct aac_dev *dev)
>               goto error_iounmap;
>       if (dev->msi_enabled)
>               aac_src_access_devreg(dev, AAC_ENABLE_MSIX);
> -     if (!dev->sync_mode && dev->msi_enabled && dev->max_msix > 1) {
> -             cpu = cpumask_first(cpu_online_mask);
> -             for (i = 0; i < dev->max_msix; i++) {
> -                     dev->aac_msix[i].vector_no = i;
> -                     dev->aac_msix[i].dev = dev;
> -
> -                     if (request_irq(dev->msixentry[i].vector,
> -                                     dev->a_ops.adapter_intr,
> -                                     0,
> -                                     "aacraid",
> -                                     &(dev->aac_msix[i]))) {
> -                             printk(KERN_ERR "%s%d: Failed to register IRQ 
> for vector %d.\n",
> -                                             name, instance, i);
> -                             for (j = 0 ; j < i ; j++)
> -                                     free_irq(dev->msixentry[j].vector,
> -                                              &(dev->aac_msix[j]));
> -                             pci_disable_msix(dev->pdev);
> -                             goto error_iounmap;
> -                     }
> -                     if (irq_set_affinity_hint(
> -                        dev->msixentry[i].vector,
> -                        get_cpu_mask(cpu))) {
> -                             printk(KERN_ERR "%s%d: Failed to set IRQ 
> affinity for cpu %d\n",
> -                                             name, instance, cpu);
> -                     }
> -                     cpu = cpumask_next(cpu, cpu_online_mask);
> -             }
> -     } else {
> -             dev->aac_msix[0].vector_no = 0;
> -             dev->aac_msix[0].dev = dev;
> -
> -             if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
> -                             IRQF_SHARED,
> -                             "aacraid",
> -                             &(dev->aac_msix[0])) < 0) {
> -                     if (dev->msi)
> -                             pci_disable_msi(dev->pdev);
> -                     printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
> -                                     name, instance);
> -                     goto error_iounmap;
> -             }
> -     }
> +
> +     if (aac_acquire_irq(dev))
> +             goto error_iounmap;
> +
>       dev->dbg_base = dev->base_start;
>       dev->dbg_base_mapped = dev->base;
>       dev->dbg_size = dev->base_size;
> -- 
> 1.9.3
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reviewed-by: Johannes Thumshirn <jthumsh...@suse.de>

-- 
Johannes Thumshirn                                       Storage
jthumsh...@suse.de                             +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to