diff mbox

[V2,6/9,SCSI] aacraid: Reset irq affinity hints before releasing irq

Message ID 1433986951-9033-8-git-send-email-rajinikanth.pandurangan@pmcs.com (mailing list archive)
State New, archived
Headers show

Commit Message

rajinikanth.pandurangan@pmcs.com June 11, 2015, 1:42 a.m. UTC
From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>

Description:
        Reset irq affinity hints before releasing IRQ
        Removed duplicate code of IRQ acquire/release

Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@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(-)

Comments

Johannes Thumshirn June 16, 2015, 11:40 a.m. UTC | #1
On Wed, Jun 10, 2015 at 06:42:28PM -0700, rajinikanth.pandurangan@pmcs.com wrote:
> From: Rajinikanth Pandurangan <rajinikanth.pandurangan@pmcs.com>
> 
> Description:
>         Reset irq affinity hints before releasing IRQ
>         Removed duplicate code of IRQ acquire/release
> 
> Signed-off-by: Rajinikanth Pandurangan <rajinikanth.pandurangan@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 majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
diff mbox

Patch

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;