ACK: [PATCH] scsi: storvsc: Parameterize number hardware queues

Colin Ian King colin.king at canonical.com
Wed Jun 2 22:07:57 UTC 2021


On 02/06/2021 22:21, Tim Gardner wrote:
> From: "Melanie Plageman (Microsoft)" <melanieplageman at gmail.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1930626
> 
> Add ability to set the number of hardware queues with new module parameter,
> storvsc_max_hw_queues. The default value remains the number of CPUs.  This
> functionality is useful in some environments (e.g. Microsoft Azure) where
> decreasing the number of hardware queues has been shown to improve
> performance.
> 
> Link: https://lore.kernel.org/r/20210224232948.4651-1-melanieplageman@gmail.com
> Reviewed-by: Michael Kelley <mikelley at microsoft.com>
> Signed-off-by: Melanie Plageman (Microsoft) <melanieplageman at gmail.com>
> Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>
> (cherry picked from commit a81a38cc6ddaf128c7ca9e3fffff21c243f33c97)
> Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
> ---
>  drivers/scsi/storvsc_drv.c | 18 ++++++++++++++++--
>  1 file changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
> index e416a6064158..b97561eae671 100644
> --- a/drivers/scsi/storvsc_drv.c
> +++ b/drivers/scsi/storvsc_drv.c
> @@ -378,10 +378,14 @@ static u32 max_outstanding_req_per_channel;
>  static int storvsc_change_queue_depth(struct scsi_device *sdev, int queue_depth);
>  
>  static int storvsc_vcpus_per_sub_channel = 4;
> +static unsigned int storvsc_max_hw_queues;
>  
>  module_param(storvsc_ringbuffer_size, int, S_IRUGO);
>  MODULE_PARM_DESC(storvsc_ringbuffer_size, "Ring buffer size (bytes)");
>  
> +module_param(storvsc_max_hw_queues, uint, 0644);
> +MODULE_PARM_DESC(storvsc_max_hw_queues, "Maximum number of hardware queues");
> +
>  module_param(storvsc_vcpus_per_sub_channel, int, S_IRUGO);
>  MODULE_PARM_DESC(storvsc_vcpus_per_sub_channel, "Ratio of VCPUs to subchannels");
>  
> @@ -1897,6 +1901,7 @@ static int storvsc_probe(struct hv_device *device,
>  {
>  	int ret;
>  	int num_cpus = num_online_cpus();
> +	int num_present_cpus = num_present_cpus();
>  	struct Scsi_Host *host;
>  	struct hv_host_device *host_dev;
>  	bool dev_is_ide = ((dev_id->driver_data == IDE_GUID) ? true : false);
> @@ -2010,8 +2015,17 @@ static int storvsc_probe(struct hv_device *device,
>  	 * For non-IDE disks, the host supports multiple channels.
>  	 * Set the number of HW queues we are supporting.
>  	 */
> -	if (!dev_is_ide)
> -		host->nr_hw_queues = num_present_cpus();
> +	if (!dev_is_ide) {
> +		if (storvsc_max_hw_queues > num_present_cpus) {
> +			storvsc_max_hw_queues = 0;
> +			storvsc_log(device, STORVSC_LOGGING_WARN,
> +				"Resetting invalid storvsc_max_hw_queues value to default.\n");
> +		}
> +		if (storvsc_max_hw_queues)
> +			host->nr_hw_queues = storvsc_max_hw_queues;
> +		else
> +			host->nr_hw_queues = num_present_cpus;
> +	}
>  
>  	/*
>  	 * Set the error handler work queue.
> 

Acked-by: Colin Ian King <colin.king at canonical.com>




More information about the kernel-team mailing list