Re: [PATCH v2] ibmvfc: Add max_sectors module parameter

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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






[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux