On Fri, 2024-08-30 at 15:42 -0500, Brian King wrote: > 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. > > Signed-off-by: Brian King <brking@xxxxxxxxxxxxx> > --- > drivers/scsi/ibmvscsi/ibmvfc.c | 17 ++++++++++++++--- > drivers/scsi/ibmvscsi/ibmvfc.h | 2 +- > 2 files changed, 15 insertions(+), 4 deletions(-) > > diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c > b/drivers/scsi/ibmvscsi/ibmvfc.c > index a3d1013c8307..3349d321aa07 100644 > --- a/drivers/scsi/ibmvscsi/ibmvfc.c > +++ b/drivers/scsi/ibmvscsi/ibmvfc.c > @@ -37,6 +37,7 @@ static unsigned int default_timeout = > IBMVFC_DEFAULT_TIMEOUT; > static u64 max_lun = IBMVFC_MAX_LUN; > static unsigned int max_targets = IBMVFC_MAX_TARGETS; > static unsigned int max_requests = IBMVFC_MAX_REQUESTS_DEFAULT; > +static u16 max_sectors = IBMVFC_MAX_SECTORS; Am I understanding correctly that the maximum supported value for max_sectors is USHRT_MAX, and you're ensuring that indirectly by using an u16 type? If yes, I think this would justify a comment in the code. Regards, Martin > static u16 scsi_qdepth = IBMVFC_SCSI_QDEPTH; > static unsigned int disc_threads = IBMVFC_MAX_DISC_THREADS; > 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_PARM_DESC(max_requests, "Maximum requests for this adapter. " > "[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_PARM_DESC(scsi_qdepth, "Maximum scsi command depth per > adapter queue. " > "[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)); > > 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_response = cpu_to_be32(sizeof(struct > ibmvfc_fcp_rsp)); > 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; > - 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", > rsp->partition_name, rsp->device_name, rsp- > >port_loc_code, > 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->max_lun = max_lun; > 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->unique_id = shost->host_no; > 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) > { > + int min_max_sectors = PAGE_SIZE >> 9; > int rc; > > if (!firmware_has_feature(FW_FEATURE_VIO)) > @@ -6564,6 +6569,12 @@ static int __init ibmvfc_module_init(void) > printk(KERN_INFO IBMVFC_NAME": IBM Virtual Fibre Channel > Driver version: %s %s\n", > IBMVFC_DRIVER_VERSION, IBMVFC_DRIVER_DATE); > > + 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); > if (!ibmvfc_transport_template) > return -ENOMEM; > diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h > b/drivers/scsi/ibmvscsi/ibmvfc.h > index 745ad5ac7251..c73ed2314ad0 100644 > --- a/drivers/scsi/ibmvscsi/ibmvfc.h > +++ b/drivers/scsi/ibmvscsi/ibmvfc.h > @@ -32,7 +32,7 @@ > #define IBMVFC_DEBUG 0 > #define IBMVFC_MAX_TARGETS 1024 > #define IBMVFC_MAX_LUN 0xffffffff > -#define IBMVFC_MAX_SECTORS 0xffffu > +#define IBMVFC_MAX_SECTORS 2048 > #define IBMVFC_MAX_DISC_THREADS 4 > #define IBMVFC_TGT_MEMPOOL_SZ 64 > #define IBMVFC_MAX_CMDS_PER_LUN 64