scsi: smartpqi: remove qdepth calculations for logical volumes
make the queue depth for LVs the same as the maximum I/Os supported by the controller Reviewed-by: Scott Benesh <scott.benesh@microsemi.com> Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com> Signed-off-by: Don Brace <don.brace@microsemi.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
d727a776d7
commit
94086f5be3
|
@ -726,7 +726,6 @@ struct report_phys_lun_extended_entry {
|
|||
};
|
||||
|
||||
/* for device_flags field of struct report_phys_lun_extended_entry */
|
||||
#define REPORT_PHYS_LUN_DEV_FLAG_NON_DISK 0x1
|
||||
#define REPORT_PHYS_LUN_DEV_FLAG_AIO_ENABLED 0x8
|
||||
|
||||
struct report_phys_lun_extended {
|
||||
|
@ -786,8 +785,6 @@ struct pqi_scsi_dev {
|
|||
u8 is_physical_device : 1;
|
||||
u8 is_external_raid_device : 1;
|
||||
u8 target_lun_valid : 1;
|
||||
u8 expose_device : 1;
|
||||
u8 no_uld_attach : 1;
|
||||
u8 aio_enabled : 1; /* only valid for physical disks */
|
||||
u8 device_gone : 1;
|
||||
u8 new_device : 1;
|
||||
|
@ -1034,9 +1031,6 @@ enum pqi_ctrl_mode {
|
|||
*/
|
||||
#define PQI_PHYSICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH 27
|
||||
|
||||
/* 0 = no limit */
|
||||
#define PQI_LOGICAL_DRIVE_DEFAULT_MAX_QUEUE_DEPTH 0
|
||||
|
||||
/* CISS commands */
|
||||
#define CISS_READ 0xc0
|
||||
#define CISS_REPORT_LOG 0xc2 /* Report Logical LUNs */
|
||||
|
|
|
@ -1302,87 +1302,6 @@ static void pqi_show_volume_status(struct pqi_ctrl_info *ctrl_info,
|
|||
device->bus, device->target, device->lun, status);
|
||||
}
|
||||
|
||||
static struct pqi_scsi_dev *pqi_find_disk_by_aio_handle(
|
||||
struct pqi_ctrl_info *ctrl_info, u32 aio_handle)
|
||||
{
|
||||
struct pqi_scsi_dev *device;
|
||||
|
||||
list_for_each_entry(device, &ctrl_info->scsi_device_list,
|
||||
scsi_device_list_entry) {
|
||||
if (device->devtype != TYPE_DISK && device->devtype != TYPE_ZBC)
|
||||
continue;
|
||||
if (pqi_is_logical_device(device))
|
||||
continue;
|
||||
if (device->aio_handle == aio_handle)
|
||||
return device;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void pqi_update_logical_drive_queue_depth(
|
||||
struct pqi_ctrl_info *ctrl_info, struct pqi_scsi_dev *logical_drive)
|
||||
{
|
||||
unsigned int i;
|
||||
struct raid_map *raid_map;
|
||||
struct raid_map_disk_data *disk_data;
|
||||
struct pqi_scsi_dev *phys_disk;
|
||||
unsigned int num_phys_disks;
|
||||
unsigned int num_raid_map_entries;
|
||||
unsigned int queue_depth;
|
||||
|
||||
logical_drive->queue_depth = PQI_LOGICAL_DRIVE_DEFAULT_MAX_QUEUE_DEPTH;
|
||||
|
||||
raid_map = logical_drive->raid_map;
|
||||
if (!raid_map)
|
||||
return;
|
||||
|
||||
disk_data = raid_map->disk_data;
|
||||
num_phys_disks = get_unaligned_le16(&raid_map->layout_map_count) *
|
||||
(get_unaligned_le16(&raid_map->data_disks_per_row) +
|
||||
get_unaligned_le16(&raid_map->metadata_disks_per_row));
|
||||
num_raid_map_entries = num_phys_disks *
|
||||
get_unaligned_le16(&raid_map->row_cnt);
|
||||
|
||||
queue_depth = 0;
|
||||
for (i = 0; i < num_raid_map_entries; i++) {
|
||||
phys_disk = pqi_find_disk_by_aio_handle(ctrl_info,
|
||||
disk_data[i].aio_handle);
|
||||
|
||||
if (!phys_disk) {
|
||||
dev_warn(&ctrl_info->pci_dev->dev,
|
||||
"failed to find physical disk for logical drive %016llx\n",
|
||||
get_unaligned_be64(logical_drive->scsi3addr));
|
||||
logical_drive->offload_enabled = false;
|
||||
logical_drive->offload_enabled_pending = false;
|
||||
kfree(raid_map);
|
||||
logical_drive->raid_map = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
queue_depth += phys_disk->queue_depth;
|
||||
}
|
||||
|
||||
logical_drive->queue_depth = queue_depth;
|
||||
}
|
||||
|
||||
static void pqi_update_all_logical_drive_queue_depths(
|
||||
struct pqi_ctrl_info *ctrl_info)
|
||||
{
|
||||
struct pqi_scsi_dev *device;
|
||||
|
||||
list_for_each_entry(device, &ctrl_info->scsi_device_list,
|
||||
scsi_device_list_entry) {
|
||||
if (device->devtype != TYPE_DISK && device->devtype != TYPE_ZBC)
|
||||
continue;
|
||||
if (!pqi_is_logical_device(device))
|
||||
continue;
|
||||
if (device->is_external_raid_device)
|
||||
continue;
|
||||
pqi_update_logical_drive_queue_depth(ctrl_info, device);
|
||||
}
|
||||
}
|
||||
|
||||
static void pqi_rescan_worker(struct work_struct *work)
|
||||
{
|
||||
struct pqi_ctrl_info *ctrl_info;
|
||||
|
@ -1478,7 +1397,7 @@ static void pqi_dev_info(struct pqi_ctrl_info *ctrl_info,
|
|||
char *action, struct pqi_scsi_dev *device)
|
||||
{
|
||||
dev_info(&ctrl_info->pci_dev->dev,
|
||||
"%s scsi %d:%d:%d:%d: %s %.8s %.16s %-12s SSDSmartPathCap%c En%c Exp%c qd=%d\n",
|
||||
"%s scsi %d:%d:%d:%d: %s %.8s %.16s %-12s SSDSmartPathCap%c En%c qd=%d\n",
|
||||
action,
|
||||
ctrl_info->scsi_host->host_no,
|
||||
device->bus,
|
||||
|
@ -1491,7 +1410,6 @@ static void pqi_dev_info(struct pqi_ctrl_info *ctrl_info,
|
|||
pqi_raid_level_to_string(device->raid_level) : "",
|
||||
device->offload_configured ? '+' : '-',
|
||||
device->offload_enabled_pending ? '+' : '-',
|
||||
device->expose_device ? '+' : '-',
|
||||
device->queue_depth);
|
||||
}
|
||||
|
||||
|
@ -1514,8 +1432,6 @@ static void pqi_scsi_update_device(struct pqi_scsi_dev *existing_device,
|
|||
existing_device->is_physical_device = new_device->is_physical_device;
|
||||
existing_device->is_external_raid_device =
|
||||
new_device->is_external_raid_device;
|
||||
existing_device->expose_device = new_device->expose_device;
|
||||
existing_device->no_uld_attach = new_device->no_uld_attach;
|
||||
existing_device->aio_enabled = new_device->aio_enabled;
|
||||
memcpy(existing_device->vendor, new_device->vendor,
|
||||
sizeof(existing_device->vendor));
|
||||
|
@ -1657,8 +1573,6 @@ static void pqi_update_device_list(struct pqi_ctrl_info *ctrl_info,
|
|||
device->keep_device = true;
|
||||
}
|
||||
|
||||
pqi_update_all_logical_drive_queue_depths(ctrl_info);
|
||||
|
||||
list_for_each_entry(device, &ctrl_info->scsi_device_list,
|
||||
scsi_device_list_entry)
|
||||
device->offload_enabled =
|
||||
|
@ -1697,7 +1611,7 @@ static void pqi_update_device_list(struct pqi_ctrl_info *ctrl_info,
|
|||
|
||||
/* Expose any new devices. */
|
||||
list_for_each_entry_safe(device, next, &add_list, add_list_entry) {
|
||||
if (device->expose_device && !device->sdev) {
|
||||
if (!device->sdev) {
|
||||
rc = pqi_add_device(ctrl_info, device);
|
||||
if (rc) {
|
||||
dev_warn(&ctrl_info->pci_dev->dev,
|
||||
|
@ -1740,38 +1654,15 @@ static bool pqi_is_supported_device(struct pqi_scsi_dev *device)
|
|||
return is_supported;
|
||||
}
|
||||
|
||||
static inline bool pqi_skip_device(u8 *scsi3addr,
|
||||
struct report_phys_lun_extended_entry *phys_lun_ext_entry)
|
||||
static inline bool pqi_skip_device(u8 *scsi3addr)
|
||||
{
|
||||
u8 device_flags;
|
||||
|
||||
if (!MASKED_DEVICE(scsi3addr))
|
||||
return false;
|
||||
|
||||
/* The device is masked. */
|
||||
|
||||
device_flags = phys_lun_ext_entry->device_flags;
|
||||
|
||||
if (device_flags & REPORT_PHYS_LUN_DEV_FLAG_NON_DISK) {
|
||||
/*
|
||||
* It's a non-disk device. We ignore all devices of this type
|
||||
* when they're masked.
|
||||
*/
|
||||
/* Ignore all masked devices. */
|
||||
if (MASKED_DEVICE(scsi3addr))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool pqi_ok_to_expose_device(struct pqi_scsi_dev *device)
|
||||
{
|
||||
/* Expose all devices except for physical devices that are masked. */
|
||||
if (device->is_physical_device && MASKED_DEVICE(device->scsi3addr))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int pqi_update_scsi_devices(struct pqi_ctrl_info *ctrl_info)
|
||||
{
|
||||
int i;
|
||||
|
@ -1870,8 +1761,7 @@ static int pqi_update_scsi_devices(struct pqi_ctrl_info *ctrl_info)
|
|||
scsi3addr = log_lun_ext_entry->lunid;
|
||||
}
|
||||
|
||||
if (is_physical_device &&
|
||||
pqi_skip_device(scsi3addr, phys_lun_ext_entry))
|
||||
if (is_physical_device && pqi_skip_device(scsi3addr))
|
||||
continue;
|
||||
|
||||
if (device)
|
||||
|
@ -1906,8 +1796,6 @@ static int pqi_update_scsi_devices(struct pqi_ctrl_info *ctrl_info)
|
|||
|
||||
pqi_assign_bus_target_lun(device);
|
||||
|
||||
device->expose_device = pqi_ok_to_expose_device(device);
|
||||
|
||||
if (device->is_physical_device) {
|
||||
device->wwid = phys_lun_ext_entry->wwid;
|
||||
if ((phys_lun_ext_entry->device_flags &
|
||||
|
@ -4840,7 +4728,7 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost,
|
|||
rc == SCSI_MLQUEUE_HOST_BUSY ||
|
||||
rc == SAM_STAT_CHECK_CONDITION ||
|
||||
rc == SAM_STAT_RESERVATION_CONFLICT)
|
||||
raid_bypassed = true;
|
||||
raid_bypassed = true;
|
||||
}
|
||||
if (!raid_bypassed)
|
||||
rc = pqi_raid_submit_scsi_cmd(ctrl_info, device, scmd,
|
||||
|
@ -5166,7 +5054,7 @@ static int pqi_slave_alloc(struct scsi_device *sdev)
|
|||
sdev_id(sdev), sdev->lun);
|
||||
}
|
||||
|
||||
if (device && device->expose_device) {
|
||||
if (device) {
|
||||
sdev->hostdata = device;
|
||||
device->sdev = sdev;
|
||||
if (device->queue_depth) {
|
||||
|
@ -5181,17 +5069,6 @@ static int pqi_slave_alloc(struct scsi_device *sdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pqi_slave_configure(struct scsi_device *sdev)
|
||||
{
|
||||
struct pqi_scsi_dev *device;
|
||||
|
||||
device = sdev->hostdata;
|
||||
if (!device->expose_device)
|
||||
sdev->no_uld_attach = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pqi_map_queues(struct Scsi_Host *shost)
|
||||
{
|
||||
struct pqi_ctrl_info *ctrl_info = shost_to_hba(shost);
|
||||
|
@ -5585,7 +5462,6 @@ static struct scsi_host_template pqi_driver_template = {
|
|||
.eh_device_reset_handler = pqi_eh_device_reset_handler,
|
||||
.ioctl = pqi_ioctl,
|
||||
.slave_alloc = pqi_slave_alloc,
|
||||
.slave_configure = pqi_slave_configure,
|
||||
.map_queues = pqi_map_queues,
|
||||
.sdev_attrs = pqi_sdev_attrs,
|
||||
.shost_attrs = pqi_shost_attrs,
|
||||
|
|
Loading…
Reference in New Issue