Commit e4a082c7 authored by Sumant Patro's avatar Sumant Patro Committed by James Bottomley

[SCSI] megaraid_sas: switch fw_outstanding to an atomic_t

This patch( originally submitted by Christoph Hellwig) removes
instance_lock and changes fw_outstanding variable data type to
atomic_t.
Signed-off-by: default avatarSumant Patro <Sumant.Patro@lsil.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent f70e9c5f
1 Release Date : Wed Feb 03 14:31:44 PST 2006 - Sumant Patro <Sumant.Patro@lsil.com>
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@lst.de>
1 Release Date : Wed Feb 03 14:31:44 PST 2006 - Sumant Patro <Sumant.Patro@lsil.com> 1 Release Date : Wed Feb 03 14:31:44 PST 2006 - Sumant Patro <Sumant.Patro@lsil.com>
2 Current Version : 00.00.02.04 2 Current Version : 00.00.02.04
3 Older Version : 00.00.02.04 3 Older Version : 00.00.02.04
......
...@@ -741,7 +741,6 @@ static int ...@@ -741,7 +741,6 @@ static int
megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (struct scsi_cmnd *)) megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (struct scsi_cmnd *))
{ {
u32 frame_count; u32 frame_count;
unsigned long flags;
struct megasas_cmd *cmd; struct megasas_cmd *cmd;
struct megasas_instance *instance; struct megasas_instance *instance;
...@@ -776,9 +775,7 @@ megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (struct scsi_cmnd *)) ...@@ -776,9 +775,7 @@ megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (struct scsi_cmnd *))
/* /*
* Issue the command to the FW * Issue the command to the FW
*/ */
spin_lock_irqsave(&instance->instance_lock, flags); atomic_inc(&instance->fw_outstanding);
instance->fw_outstanding++;
spin_unlock_irqrestore(&instance->instance_lock, flags);
instance->instancet->fire_cmd(cmd->frame_phys_addr ,cmd->frame_count-1,instance->reg_set); 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(struct megasas_instance *instance) ...@@ -826,19 +823,20 @@ static int megasas_wait_for_outstanding(struct megasas_instance *instance)
for (i = 0; i < wait_time; i++) { for (i = 0; i < wait_time; i++) {
if (!instance->fw_outstanding) int outstanding = atomic_read(&instance->fw_outstanding);
if (!outstanding)
break; break;
if (!(i % MEGASAS_RESET_NOTICE_INTERVAL)) { if (!(i % MEGASAS_RESET_NOTICE_INTERVAL)) {
printk(KERN_NOTICE "megasas: [%2d]waiting for %d " printk(KERN_NOTICE "megasas: [%2d]waiting for %d "
"commands to complete\n", i, "commands to complete\n",i,outstanding);
instance->fw_outstanding);
} }
msleep(1000); msleep(1000);
} }
if (instance->fw_outstanding) { if (atomic_read(&instance->fw_outstanding)) {
instance->hw_crit_error = 1; instance->hw_crit_error = 1;
return FAILED; return FAILED;
} }
...@@ -1050,7 +1048,6 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, ...@@ -1050,7 +1048,6 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
{ {
int exception = 0; int exception = 0;
struct megasas_header *hdr = &cmd->frame->hdr; struct megasas_header *hdr = &cmd->frame->hdr;
unsigned long flags;
if (cmd->scmd) { if (cmd->scmd) {
cmd->scmd->SCp.ptr = (char *)0; cmd->scmd->SCp.ptr = (char *)0;
...@@ -1082,9 +1079,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, ...@@ -1082,9 +1079,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
if (exception) { if (exception) {
spin_lock_irqsave(&instance->instance_lock, flags); atomic_dec(&instance->fw_outstanding);
instance->fw_outstanding--;
spin_unlock_irqrestore(&instance->instance_lock, flags);
megasas_unmap_sgbuf(instance, cmd); megasas_unmap_sgbuf(instance, cmd);
cmd->scmd->scsi_done(cmd->scmd); cmd->scmd->scsi_done(cmd->scmd);
...@@ -1132,9 +1127,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, ...@@ -1132,9 +1127,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
break; break;
} }
spin_lock_irqsave(&instance->instance_lock, flags); atomic_dec(&instance->fw_outstanding);
instance->fw_outstanding--;
spin_unlock_irqrestore(&instance->instance_lock, flags);
megasas_unmap_sgbuf(instance, cmd); megasas_unmap_sgbuf(instance, cmd);
cmd->scmd->scsi_done(cmd->scmd); cmd->scmd->scsi_done(cmd->scmd);
...@@ -2171,11 +2164,12 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -2171,11 +2164,12 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
*/ */
INIT_LIST_HEAD(&instance->cmd_pool); INIT_LIST_HEAD(&instance->cmd_pool);
atomic_set(&instance->fw_outstanding,0);
init_waitqueue_head(&instance->int_cmd_wait_q); init_waitqueue_head(&instance->int_cmd_wait_q);
init_waitqueue_head(&instance->abort_cmd_wait_q); init_waitqueue_head(&instance->abort_cmd_wait_q);
spin_lock_init(&instance->cmd_pool_lock); spin_lock_init(&instance->cmd_pool_lock);
spin_lock_init(&instance->instance_lock);
sema_init(&instance->aen_mutex, 1); sema_init(&instance->aen_mutex, 1);
sema_init(&instance->ioctl_sem, MEGASAS_INT_CMDS); sema_init(&instance->ioctl_sem, MEGASAS_INT_CMDS);
......
...@@ -1077,9 +1077,8 @@ struct megasas_instance { ...@@ -1077,9 +1077,8 @@ struct megasas_instance {
struct pci_dev *pdev; struct pci_dev *pdev;
u32 unique_id; u32 unique_id;
u32 fw_outstanding; atomic_t fw_outstanding;
u32 hw_crit_error; u32 hw_crit_error;
spinlock_t instance_lock;
struct megasas_instance_template *instancet; struct megasas_instance_template *instancet;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment