Skip to content

Commit

Permalink
[SCSI] megaraid_sas: switch fw_outstanding to an atomic_t
Browse files Browse the repository at this point in the history
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@lsil.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
  • Loading branch information
Sumant Patro authored and James Bottomley committed Jun 6, 2006
1 parent f70e9c5 commit e4a082c
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 18 deletions.
13 changes: 13 additions & 0 deletions Documentation/scsi/ChangeLog.megaraid_sas
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@

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>
2 Current Version : 00.00.02.04
3 Older Version : 00.00.02.04
Expand Down
26 changes: 10 additions & 16 deletions drivers/scsi/megaraid/megaraid_sas.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -776,9 +775,7 @@ megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (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);

Expand Down Expand Up @@ -826,19 +823,20 @@ static int megasas_wait_for_outstanding(struct megasas_instance *instance)

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;
}
Expand Down Expand Up @@ -1050,7 +1048,6 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
{
int exception = 0;
struct megasas_header *hdr = &cmd->frame->hdr;
unsigned long flags;

if (cmd->scmd) {
cmd->scmd->SCp.ptr = (char *)0;
Expand Down Expand Up @@ -1082,9 +1079,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,

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);
Expand Down Expand Up @@ -1132,9 +1127,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
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);
Expand Down Expand Up @@ -2171,11 +2164,12 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
*/
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);
Expand Down
3 changes: 1 addition & 2 deletions drivers/scsi/megaraid/megaraid_sas.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand Down

0 comments on commit e4a082c

Please sign in to comment.