mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 03:48:59 +00:00
scsi: ibmvfc: Add max_sectors module parameter
There are some scenarios that can occur, such as performing an upgrade of the virtual I/O server, where the supported max transfer of the backing device for an ibmvfc HBA can change. If the max transfer of the backing device decreases, this can cause issues with previously discovered LUNs. This patch accomplishes two things. First, it changes the default ibmvfc max transfer value to 1MB. This is generally supported by all backing devices, which should mitigate this issue out of the box. Secondly, it adds a module parameter, enabling a user to increase the max transfer value to values that are larger than 1MB, as long as they have configured these larger values on the virtual I/O server as well. [mkp: fix checkpatch warnings] Signed-off-by: Brian King <brking@linux.ibm.com> Link: https://lore.kernel.org/r/20240903134708.139645-2-brking@linux.ibm.com Reviewed-by: Martin Wilck <mwilck@suse.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
b112947ffc
commit
e368400694
@ -37,6 +37,7 @@ static unsigned int default_timeout = IBMVFC_DEFAULT_TIMEOUT;
|
|||||||
static u64 max_lun = IBMVFC_MAX_LUN;
|
static u64 max_lun = IBMVFC_MAX_LUN;
|
||||||
static unsigned int max_targets = IBMVFC_MAX_TARGETS;
|
static unsigned int max_targets = IBMVFC_MAX_TARGETS;
|
||||||
static unsigned int max_requests = IBMVFC_MAX_REQUESTS_DEFAULT;
|
static unsigned int max_requests = IBMVFC_MAX_REQUESTS_DEFAULT;
|
||||||
|
static u16 max_sectors = IBMVFC_MAX_SECTORS;
|
||||||
static u16 scsi_qdepth = IBMVFC_SCSI_QDEPTH;
|
static u16 scsi_qdepth = IBMVFC_SCSI_QDEPTH;
|
||||||
static unsigned int disc_threads = IBMVFC_MAX_DISC_THREADS;
|
static unsigned int disc_threads = IBMVFC_MAX_DISC_THREADS;
|
||||||
static unsigned int ibmvfc_debug = IBMVFC_DEBUG;
|
static unsigned int ibmvfc_debug = IBMVFC_DEBUG;
|
||||||
@ -83,6 +84,9 @@ MODULE_PARM_DESC(default_timeout,
|
|||||||
module_param_named(max_requests, max_requests, uint, S_IRUGO);
|
module_param_named(max_requests, max_requests, uint, S_IRUGO);
|
||||||
MODULE_PARM_DESC(max_requests, "Maximum requests for this adapter. "
|
MODULE_PARM_DESC(max_requests, "Maximum requests for this adapter. "
|
||||||
"[Default=" __stringify(IBMVFC_MAX_REQUESTS_DEFAULT) "]");
|
"[Default=" __stringify(IBMVFC_MAX_REQUESTS_DEFAULT) "]");
|
||||||
|
module_param_named(max_sectors, max_sectors, ushort, S_IRUGO);
|
||||||
|
MODULE_PARM_DESC(max_sectors, "Maximum sectors for this adapter. "
|
||||||
|
"[Default=" __stringify(IBMVFC_MAX_SECTORS) "]");
|
||||||
module_param_named(scsi_qdepth, scsi_qdepth, ushort, S_IRUGO);
|
module_param_named(scsi_qdepth, scsi_qdepth, ushort, S_IRUGO);
|
||||||
MODULE_PARM_DESC(scsi_qdepth, "Maximum scsi command depth per adapter queue. "
|
MODULE_PARM_DESC(scsi_qdepth, "Maximum scsi command depth per adapter queue. "
|
||||||
"[Default=" __stringify(IBMVFC_SCSI_QDEPTH) "]");
|
"[Default=" __stringify(IBMVFC_SCSI_QDEPTH) "]");
|
||||||
@ -1494,7 +1498,7 @@ static void ibmvfc_set_login_info(struct ibmvfc_host *vhost)
|
|||||||
memset(login_info, 0, sizeof(*login_info));
|
memset(login_info, 0, sizeof(*login_info));
|
||||||
|
|
||||||
login_info->ostype = cpu_to_be32(IBMVFC_OS_LINUX);
|
login_info->ostype = cpu_to_be32(IBMVFC_OS_LINUX);
|
||||||
login_info->max_dma_len = cpu_to_be64(IBMVFC_MAX_SECTORS << 9);
|
login_info->max_dma_len = cpu_to_be64(max_sectors << 9);
|
||||||
login_info->max_payload = cpu_to_be32(sizeof(struct ibmvfc_fcp_cmd_iu));
|
login_info->max_payload = cpu_to_be32(sizeof(struct ibmvfc_fcp_cmd_iu));
|
||||||
login_info->max_response = cpu_to_be32(sizeof(struct ibmvfc_fcp_rsp));
|
login_info->max_response = cpu_to_be32(sizeof(struct ibmvfc_fcp_rsp));
|
||||||
login_info->partition_num = cpu_to_be32(vhost->partition_number);
|
login_info->partition_num = cpu_to_be32(vhost->partition_number);
|
||||||
@ -5230,7 +5234,7 @@ static void ibmvfc_npiv_login_done(struct ibmvfc_event *evt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
vhost->logged_in = 1;
|
vhost->logged_in = 1;
|
||||||
npiv_max_sectors = min((uint)(be64_to_cpu(rsp->max_dma_len) >> 9), IBMVFC_MAX_SECTORS);
|
npiv_max_sectors = min((uint)(be64_to_cpu(rsp->max_dma_len) >> 9), max_sectors);
|
||||||
dev_info(vhost->dev, "Host partition: %s, device: %s %s %s max sectors %u\n",
|
dev_info(vhost->dev, "Host partition: %s, device: %s %s %s max sectors %u\n",
|
||||||
rsp->partition_name, rsp->device_name, rsp->port_loc_code,
|
rsp->partition_name, rsp->device_name, rsp->port_loc_code,
|
||||||
rsp->drc_name, npiv_max_sectors);
|
rsp->drc_name, npiv_max_sectors);
|
||||||
@ -6329,7 +6333,7 @@ static int ibmvfc_probe(struct vio_dev *vdev, const struct vio_device_id *id)
|
|||||||
shost->can_queue = scsi_qdepth;
|
shost->can_queue = scsi_qdepth;
|
||||||
shost->max_lun = max_lun;
|
shost->max_lun = max_lun;
|
||||||
shost->max_id = max_targets;
|
shost->max_id = max_targets;
|
||||||
shost->max_sectors = IBMVFC_MAX_SECTORS;
|
shost->max_sectors = max_sectors;
|
||||||
shost->max_cmd_len = IBMVFC_MAX_CDB_LEN;
|
shost->max_cmd_len = IBMVFC_MAX_CDB_LEN;
|
||||||
shost->unique_id = shost->host_no;
|
shost->unique_id = shost->host_no;
|
||||||
shost->nr_hw_queues = mq_enabled ? min(max_scsi_queues, nr_scsi_hw_queues) : 1;
|
shost->nr_hw_queues = mq_enabled ? min(max_scsi_queues, nr_scsi_hw_queues) : 1;
|
||||||
@ -6556,6 +6560,7 @@ static struct fc_function_template ibmvfc_transport_functions = {
|
|||||||
**/
|
**/
|
||||||
static int __init ibmvfc_module_init(void)
|
static int __init ibmvfc_module_init(void)
|
||||||
{
|
{
|
||||||
|
int min_max_sectors = PAGE_SIZE >> 9;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (!firmware_has_feature(FW_FEATURE_VIO))
|
if (!firmware_has_feature(FW_FEATURE_VIO))
|
||||||
@ -6564,6 +6569,16 @@ static int __init ibmvfc_module_init(void)
|
|||||||
printk(KERN_INFO IBMVFC_NAME": IBM Virtual Fibre Channel Driver version: %s %s\n",
|
printk(KERN_INFO IBMVFC_NAME": IBM Virtual Fibre Channel Driver version: %s %s\n",
|
||||||
IBMVFC_DRIVER_VERSION, IBMVFC_DRIVER_DATE);
|
IBMVFC_DRIVER_VERSION, IBMVFC_DRIVER_DATE);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Range check the max_sectors module parameter. The upper bounds is
|
||||||
|
* implicity checked since the parameter is a ushort.
|
||||||
|
*/
|
||||||
|
if (max_sectors < min_max_sectors) {
|
||||||
|
printk(KERN_ERR IBMVFC_NAME ": max_sectors must be at least %d.\n",
|
||||||
|
min_max_sectors);
|
||||||
|
max_sectors = min_max_sectors;
|
||||||
|
}
|
||||||
|
|
||||||
ibmvfc_transport_template = fc_attach_transport(&ibmvfc_transport_functions);
|
ibmvfc_transport_template = fc_attach_transport(&ibmvfc_transport_functions);
|
||||||
if (!ibmvfc_transport_template)
|
if (!ibmvfc_transport_template)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
#define IBMVFC_DEBUG 0
|
#define IBMVFC_DEBUG 0
|
||||||
#define IBMVFC_MAX_TARGETS 1024
|
#define IBMVFC_MAX_TARGETS 1024
|
||||||
#define IBMVFC_MAX_LUN 0xffffffff
|
#define IBMVFC_MAX_LUN 0xffffffff
|
||||||
#define IBMVFC_MAX_SECTORS 0xffffu
|
#define IBMVFC_MAX_SECTORS 2048
|
||||||
#define IBMVFC_MAX_DISC_THREADS 4
|
#define IBMVFC_MAX_DISC_THREADS 4
|
||||||
#define IBMVFC_TGT_MEMPOOL_SZ 64
|
#define IBMVFC_TGT_MEMPOOL_SZ 64
|
||||||
#define IBMVFC_MAX_CMDS_PER_LUN 64
|
#define IBMVFC_MAX_CMDS_PER_LUN 64
|
||||||
|
Loading…
Reference in New Issue
Block a user