[patch 26/31] megaraid_sas: switch fw_outstanding to an atomic_t

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

 



From: Sumant Patro <sumantp@xxxxxxxx>

This patch( originally submitted by Christoph Hellwig) removes
instance_lock and changes fw_outstanding variable data type to atomic_t.

Signed-off-by: Sumant Patro <Sumant.Patro@xxxxxxxx>
Cc: James Bottomley <James.Bottomley@xxxxxxxxxxxx>
Cc: Christoph Hellwig <hch@xxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxx>
---

 Documentation/scsi/ChangeLog.megaraid_sas |   13 ++++++++++
 drivers/scsi/megaraid/megaraid_sas.c      |   26 +++++++-------------
 drivers/scsi/megaraid/megaraid_sas.h      |    3 --
 3 files changed, 24 insertions(+), 18 deletions(-)

diff -puN Documentation/scsi/ChangeLog.megaraid_sas~megaraid_sas-switch-fw_outstanding-to-an-atomic_t Documentation/scsi/ChangeLog.megaraid_sas
--- devel/Documentation/scsi/ChangeLog.megaraid_sas~megaraid_sas-switch-fw_outstanding-to-an-atomic_t	2006-05-30 17:51:39.000000000 -0700
+++ devel-akpm/Documentation/scsi/ChangeLog.megaraid_sas	2006-05-30 17:51:39.000000000 -0700
@@ -1,3 +1,16 @@
+
+1 Release Date    : Wed Feb 03 14:31:44 PST 2006 - Sumant Patro <Sumant.Patro@xxxxxxxx>
+2 Current Version : 00.00.02.04
+3 Older Version   : 00.00.02.04
+
+i.	Remove superflous instance_lock
+
+	gets rid of the otherwise superflous instance_lock and avoids an unsave
+	unsynchronized access in the error handler.
+
+		- Christoph Hellwig <hch@xxxxxx>
+
+
 1 Release Date    : Wed Feb 03 14:31:44 PST 2006 - Sumant Patro <Sumant.Patro@xxxxxxxx>
 2 Current Version : 00.00.02.04
 3 Older Version   : 00.00.02.04 
diff -puN drivers/scsi/megaraid/megaraid_sas.c~megaraid_sas-switch-fw_outstanding-to-an-atomic_t drivers/scsi/megaraid/megaraid_sas.c
--- devel/drivers/scsi/megaraid/megaraid_sas.c~megaraid_sas-switch-fw_outstanding-to-an-atomic_t	2006-05-30 17:51:39.000000000 -0700
+++ devel-akpm/drivers/scsi/megaraid/megaraid_sas.c	2006-05-30 17:51:39.000000000 -0700
@@ -741,7 +741,6 @@ static int
 megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (struct scsi_cmnd *))
 {
 	u32 frame_count;
-	unsigned long flags;
 	struct megasas_cmd *cmd;
 	struct megasas_instance *instance;
 
@@ -776,9 +775,7 @@ megasas_queue_command(struct scsi_cmnd *
 	/*
 	 * Issue the command to the FW
 	 */
-	spin_lock_irqsave(&instance->instance_lock, flags);
-	instance->fw_outstanding++;
-	spin_unlock_irqrestore(&instance->instance_lock, flags);
+	atomic_inc(&instance->fw_outstanding);
 
 	instance->instancet->fire_cmd(cmd->frame_phys_addr ,cmd->frame_count-1,instance->reg_set);
 
@@ -826,19 +823,20 @@ static int megasas_wait_for_outstanding(
 
 	for (i = 0; i < wait_time; i++) {
 
-		if (!instance->fw_outstanding)
+		int outstanding = atomic_read(&instance->fw_outstanding);
+
+		if (!outstanding)
 			break;
 
 		if (!(i % MEGASAS_RESET_NOTICE_INTERVAL)) {
 			printk(KERN_NOTICE "megasas: [%2d]waiting for %d "
-			       "commands to complete\n", i,
-			       instance->fw_outstanding);
+			       "commands to complete\n",i,outstanding);
 		}
 
 		msleep(1000);
 	}
 
-	if (instance->fw_outstanding) {
+	if (atomic_read(&instance->fw_outstanding)) {
 		instance->hw_crit_error = 1;
 		return FAILED;
 	}
@@ -1050,7 +1048,6 @@ megasas_complete_cmd(struct megasas_inst
 {
 	int exception = 0;
 	struct megasas_header *hdr = &cmd->frame->hdr;
-	unsigned long flags;
 
 	if (cmd->scmd) {
 		cmd->scmd->SCp.ptr = (char *)0;
@@ -1082,9 +1079,7 @@ megasas_complete_cmd(struct megasas_inst
 
 		if (exception) {
 
-			spin_lock_irqsave(&instance->instance_lock, flags);
-			instance->fw_outstanding--;
-			spin_unlock_irqrestore(&instance->instance_lock, flags);
+			atomic_dec(&instance->fw_outstanding);
 
 			megasas_unmap_sgbuf(instance, cmd);
 			cmd->scmd->scsi_done(cmd->scmd);
@@ -1132,9 +1127,7 @@ megasas_complete_cmd(struct megasas_inst
 			break;
 		}
 
-		spin_lock_irqsave(&instance->instance_lock, flags);
-		instance->fw_outstanding--;
-		spin_unlock_irqrestore(&instance->instance_lock, flags);
+		atomic_dec(&instance->fw_outstanding);
 
 		megasas_unmap_sgbuf(instance, cmd);
 		cmd->scmd->scsi_done(cmd->scmd);
@@ -2171,11 +2164,12 @@ megasas_probe_one(struct pci_dev *pdev, 
 	 */
 	INIT_LIST_HEAD(&instance->cmd_pool);
 
+	atomic_set(&instance->fw_outstanding,0);
+
 	init_waitqueue_head(&instance->int_cmd_wait_q);
 	init_waitqueue_head(&instance->abort_cmd_wait_q);
 
 	spin_lock_init(&instance->cmd_pool_lock);
-	spin_lock_init(&instance->instance_lock);
 
 	sema_init(&instance->aen_mutex, 1);
 	sema_init(&instance->ioctl_sem, MEGASAS_INT_CMDS);
diff -puN drivers/scsi/megaraid/megaraid_sas.h~megaraid_sas-switch-fw_outstanding-to-an-atomic_t drivers/scsi/megaraid/megaraid_sas.h
--- devel/drivers/scsi/megaraid/megaraid_sas.h~megaraid_sas-switch-fw_outstanding-to-an-atomic_t	2006-05-30 17:51:39.000000000 -0700
+++ devel-akpm/drivers/scsi/megaraid/megaraid_sas.h	2006-05-30 17:51:39.000000000 -0700
@@ -1077,9 +1077,8 @@ struct megasas_instance {
 	struct pci_dev *pdev;
 	u32 unique_id;
 
-	u32 fw_outstanding;
+	atomic_t fw_outstanding;
 	u32 hw_crit_error;
-	spinlock_t instance_lock;
 
 	struct megasas_instance_template *instancet;
 };
_
-
: 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