Re: [PATCH v5 1/2] usb-storage: fix sdev->host->dma_dev

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

 



On Thu, Sep 03, 2020 at 04:50:34PM +0800, Tom Yan wrote:
> Use scsi_add_host_with_dma() instead of scsi_add_host() in usb.c and uas.c.
> 
> When the scsi request queue is initialized/allocated, hw_max_sectors is clamped
> to the dma max mapping size. Therefore, the correct device that should be used
> for the clamping needs to be set.
> 
> The same clamping is still needed in the USB drivers as hw_max_sectors could be
> changed there. The original clamping would be invalidated in such cases.
> 
> Signed-off-by: Tom Yan <tom.ty89@xxxxxxxxx>
> ---
> v2: fix commit message line length; bump hw_max_sectors to 2048 for SS UAS
> drives; split the "fallback" hw_max_sectors setting into another patch
> v3: use a different approach: fix the dma_dev instead
> v4: add the changelog of the patch series
> v5: fix changelog line length
>  drivers/usb/storage/scsiglue.c |  2 +-
>  drivers/usb/storage/uas.c      | 17 +++++++++++------
>  drivers/usb/storage/usb.c      |  5 +++--
>  3 files changed, 15 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
> index e5a971b83e3f..560efd1479ba 100644
> --- a/drivers/usb/storage/scsiglue.c
> +++ b/drivers/usb/storage/scsiglue.c
> @@ -92,7 +92,7 @@ static int slave_alloc (struct scsi_device *sdev)
>  static int slave_configure(struct scsi_device *sdev)
>  {
>  	struct us_data *us = host_to_us(sdev->host);
> -	struct device *dev = us->pusb_dev->bus->sysdev;
> +	struct device *dev = sdev->host->dma_dev;
>  
>  	/*
>  	 * Many devices have trouble transferring more than 32KB at a time,
> diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
> index 08f9296431e9..f4beeb8a8adb 100644
> --- a/drivers/usb/storage/uas.c
> +++ b/drivers/usb/storage/uas.c
> @@ -827,17 +827,22 @@ static int uas_slave_alloc(struct scsi_device *sdev)
>  	 */
>  	blk_queue_update_dma_alignment(sdev->request_queue, (512 - 1));
>  
> -	if (devinfo->flags & US_FL_MAX_SECTORS_64)
> -		blk_queue_max_hw_sectors(sdev->request_queue, 64);
> -	else if (devinfo->flags & US_FL_MAX_SECTORS_240)
> -		blk_queue_max_hw_sectors(sdev->request_queue, 240);
> -
>  	return 0;
>  }
>  
>  static int uas_slave_configure(struct scsi_device *sdev)
>  {
>  	struct uas_dev_info *devinfo = sdev->hostdata;
> +	struct device *dev = sdev->host->dma_dev;
> +
> +	if (devinfo->flags & US_FL_MAX_SECTORS_64)
> +		blk_queue_max_hw_sectors(sdev->request_queue, 64);
> +	else if (devinfo->flags & US_FL_MAX_SECTORS_240)
> +		blk_queue_max_hw_sectors(sdev->request_queue, 240);
> +
> +	blk_queue_max_hw_sectors(sdev->request_queue,
> +		min_t(size_t, queue_max_hw_sectors(sdev->request_queue),
> +		      dma_max_mapping_size(dev) >> SECTOR_SHIFT));
>  
>  	if (devinfo->flags & US_FL_NO_REPORT_OPCODES)
>  		sdev->no_report_opcodes = 1;
> @@ -1023,7 +1028,7 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
>  	shost->can_queue = devinfo->qdepth - 2;
>  
>  	usb_set_intfdata(intf, shost);
> -	result = scsi_add_host(shost, &intf->dev);
> +	result = scsi_add_host_with_dma(shost, &intf->dev, udev->bus->sysdev);
>  	if (result)
>  		goto free_streams;
>  
> diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
> index 94a64729dc27..c2ef367cf257 100644
> --- a/drivers/usb/storage/usb.c
> +++ b/drivers/usb/storage/usb.c
> @@ -1049,8 +1049,9 @@ int usb_stor_probe2(struct us_data *us)
>  		goto BadDevice;
>  	usb_autopm_get_interface_no_resume(us->pusb_intf);
>  	snprintf(us->scsi_name, sizeof(us->scsi_name), "usb-storage %s",
> -					dev_name(&us->pusb_intf->dev));
> -	result = scsi_add_host(us_to_host(us), dev);
> +					dev_name(dev));
> +	result = scsi_add_host_with_dma(us_to_host(us), dev,
> +					us->pusb_dev->bus->sysdev);
>  	if (result) {
>  		dev_warn(dev,
>  				"Unable to add the scsi host\n");
> -- 
> 2.28.0

These changes look fine.

However, usb-storage and uas are two separate drivers.  Could you split 
the patch into two, one containing the changes to usb.c and scsiglue.c 
(those are part of usb-storage) and the other containing the changes to 
uas.c?

Alan Stern



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux