Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line

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 
+10 −16
Original line number Diff line number Diff line
@@ -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 *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);

@@ -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;
	}
@@ -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;
@@ -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);
@@ -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);
@@ -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);
+1 −2
Original line number Diff line number Diff line
@@ -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;
};