On Wed, Jun 10, 2015 at 06:42:28PM -0700, rajinikanth.pandurangan@xxxxxxxx wrote: > From: Rajinikanth Pandurangan <rajinikanth.pandurangan@xxxxxxxx> > > Description: > Reset irq affinity hints before releasing IRQ > Removed duplicate code of IRQ acquire/release > > Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@xxxxxxxx> > --- > 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 majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html Reviewed-by: Johannes Thumshirn <jthumshirn@xxxxxxx> -- Johannes Thumshirn Storage jthumshirn@xxxxxxx +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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html