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

Commit 94086f5b authored by Kevin Barnett's avatar Kevin Barnett Committed by Martin K. Petersen
Browse files

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: default avatarScott Benesh <scott.benesh@microsemi.com>
Signed-off-by: default avatarKevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: default avatarDon Brace <don.brace@microsemi.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent d727a776
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -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 */
+8 −132
Original line number Diff line number Diff line
@@ -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,36 +1654,13 @@ 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)
@@ -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 &
@@ -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,