Commit 80d560d9 authored by Mike McGowen's avatar Mike McGowen Committed by Martin K. Petersen
Browse files

scsi: smartpqi: Remove contention for raid_bypass_cnt



Reduce CPU contention when incrementing variable raid_bypass_cnt.

Remove the atomic operations for this variable by changing the atomic to an
unsigned int and replace atomic operations with standard operations. The
value is only checked that it is increasing and accuracy is not required.

Reviewed-by: default avatarScott Benesh <scott.benesh@microchip.com>
Reviewed-by: default avatarScott Teel <scott.teel@microchip.com>
Reviewed-by: default avatarKevin Barnett <kevin.barnett@microchip.com>
Signed-off-by: default avatarMike McGowen <mike.mcgowen@microchip.com>
Signed-off-by: default avatarDon Brace <don.brace@microchip.com>
Link: https://lore.kernel.org/r/20230428153712.297638-6-don.brace@microchip.com


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 2312e844
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1147,7 +1147,7 @@ struct pqi_scsi_dev {

	struct pqi_stream_data stream_data[NUM_STREAMS_PER_LUN];
	atomic_t scsi_cmds_outstanding[PQI_MAX_LUNS_PER_DEVICE];
	atomic_t raid_bypass_cnt;
	unsigned int raid_bypass_cnt;
};

/* VPD inquiry pages */
+3 −3
Original line number Diff line number Diff line
@@ -6052,7 +6052,7 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost, struct scsi_cmnd *scm
			rc = pqi_raid_bypass_submit_scsi_cmd(ctrl_info, device, scmd, queue_group);
			if (rc == 0 || rc == SCSI_MLQUEUE_HOST_BUSY) {
				raid_bypassed = true;
				atomic_inc(&device->raid_bypass_cnt);
				device->raid_bypass_cnt++;
			}
		}
		if (!raid_bypassed)
@@ -7288,7 +7288,7 @@ static ssize_t pqi_raid_bypass_cnt_show(struct device *dev,
	struct scsi_device *sdev;
	struct pqi_scsi_dev *device;
	unsigned long flags;
	int raid_bypass_cnt;
	unsigned int raid_bypass_cnt;

	sdev = to_scsi_device(dev);
	ctrl_info = shost_to_hba(sdev->host);
@@ -7304,7 +7304,7 @@ static ssize_t pqi_raid_bypass_cnt_show(struct device *dev,
		return -ENODEV;
	}

	raid_bypass_cnt = atomic_read(&device->raid_bypass_cnt);
	raid_bypass_cnt = device->raid_bypass_cnt;

	spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);