diff mbox

[1/1] uas: leave can_queue as MAX_CMNDS if device reports larger qdepth

Message ID 574329ae.c726620a.60f3.ffffd14b@mx.google.com (mailing list archive)
State Rejected, archived
Headers show

Commit Message

Tom Yan May 23, 2016, 4:02 p.m. UTC
From: Tom Yan <tom.ty89@gmail.com>

Commit 198de51dbc34 ("USB: uas: Limit qdepth at the scsi-host level") made
qdepth limit set in host template (`.can_queue = MAX_CMNDS`) useless.

Instead of removing the template limit, now we only change limit according
to the qdepth reported by the device if it is smaller than MAX_CMNDS.

Signed-off-by: Tom Yan <tom.ty89@gmail.com>

Comments

Greg Kroah-Hartman May 23, 2016, 5 p.m. UTC | #1
On Tue, May 24, 2016 at 12:02:43AM +0800, tom.ty89@gmail.com wrote:
> From: Tom Yan <tom.ty89@gmail.com>
> 
> Commit 198de51dbc34 ("USB: uas: Limit qdepth at the scsi-host level") made
> qdepth limit set in host template (`.can_queue = MAX_CMNDS`) useless.
> 
> Instead of removing the template limit, now we only change limit according
> to the qdepth reported by the device if it is smaller than MAX_CMNDS.
> 
> Signed-off-by: Tom Yan <tom.ty89@gmail.com>
> 
> diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
> index 4d49fce..d7790e6 100644
> --- a/drivers/usb/storage/uas.c
> +++ b/drivers/usb/storage/uas.c
> @@ -972,7 +972,8 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
>  	 * 1 tag is reserved for untagged commands +
>  	 * 1 tag to avoid off by one errors in some bridge firmwares
>  	 */
> -	shost->can_queue = devinfo->qdepth - 2;
> +	if (devinfo->qdepth - 2 < MAX_CMNDS)
> +		shost->can_queue = devinfo->qdepth - 2;

What's wrong with Hans's patch for this issue instead?

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Tom Yan May 23, 2016, 5:23 p.m. UTC | #2
Nothing wrong. It's just .can_queue = MAX_CMNDS in the host template
is no longer neceesary, since with his patch, uas will set can_queue
again later (to devinfo->qdepth - 2).

Originally I thought .can_queue = MAX_CMNDS can hence be removed; but
after a second thought, I think it might probably be better if we
leave it there and make use of it, in case certain device somehow
inapproriately reports an enormous qdepth (i.e. larger than
MAX_CMNDS). (According to the commit message of 55ff8cfbc4e1 ("USB:
uas: Reduce can_queue to MAX_CMNDS"), "The uas driver can never queue
more then MAX_CMNDS...")

On 24 May 2016 at 01:00, Greg KH <gregkh@linuxfoundation.org> wrote:
> On Tue, May 24, 2016 at 12:02:43AM +0800, tom.ty89@gmail.com wrote:
>> From: Tom Yan <tom.ty89@gmail.com>
>>
>> Commit 198de51dbc34 ("USB: uas: Limit qdepth at the scsi-host level") made
>> qdepth limit set in host template (`.can_queue = MAX_CMNDS`) useless.
>>
>> Instead of removing the template limit, now we only change limit according
>> to the qdepth reported by the device if it is smaller than MAX_CMNDS.
>>
>> Signed-off-by: Tom Yan <tom.ty89@gmail.com>
>>
>> diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
>> index 4d49fce..d7790e6 100644
>> --- a/drivers/usb/storage/uas.c
>> +++ b/drivers/usb/storage/uas.c
>> @@ -972,7 +972,8 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
>>        * 1 tag is reserved for untagged commands +
>>        * 1 tag to avoid off by one errors in some bridge firmwares
>>        */
>> -     shost->can_queue = devinfo->qdepth - 2;
>> +     if (devinfo->qdepth - 2 < MAX_CMNDS)
>> +             shost->can_queue = devinfo->qdepth - 2;
>
> What's wrong with Hans's patch for this issue instead?
>
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
James Bottomley May 23, 2016, 5:27 p.m. UTC | #3
On Tue, 2016-05-24 at 01:23 +0800, Tom Yan wrote:
> Nothing wrong. It's just .can_queue = MAX_CMNDS in the host template
> is no longer neceesary, since with his patch, uas will set can_queue
> again later (to devinfo->qdepth - 2).
> 
> Originally I thought .can_queue = MAX_CMNDS can hence be removed; but
> after a second thought, I think it might probably be better if we
> leave it there and make use of it, in case certain device somehow
> inapproriately reports an enormous qdepth (i.e. larger than
> MAX_CMNDS). (According to the commit message of 55ff8cfbc4e1 ("USB:
> uas: Reduce can_queue to MAX_CMNDS"), "The uas driver can never queue
> more then MAX_CMNDS...")

OK, so try this as an exercise: Why would this not be the right thing
to do after the host is prepared:  It has to do with the streams
resources the driver has already created.

James


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Tom Yan May 23, 2016, 6:33 p.m. UTC | #4
I don't quite get what you mean. Are you saying that it is impossible
that UAS devices would report inappropriately high qdepth, because of
this?
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/storage/uas.c?h=v4.6#n908

In that case should I send another patch that simply has `.can_queue =
MAX_CMNDS` in the host template removed?

On 24 May 2016 at 01:27, James Bottomley
<James.Bottomley@hansenpartnership.com> wrote:
> On Tue, 2016-05-24 at 01:23 +0800, Tom Yan wrote:
>> Nothing wrong. It's just .can_queue = MAX_CMNDS in the host template
>> is no longer neceesary, since with his patch, uas will set can_queue
>> again later (to devinfo->qdepth - 2).
>>
>> Originally I thought .can_queue = MAX_CMNDS can hence be removed; but
>> after a second thought, I think it might probably be better if we
>> leave it there and make use of it, in case certain device somehow
>> inapproriately reports an enormous qdepth (i.e. larger than
>> MAX_CMNDS). (According to the commit message of 55ff8cfbc4e1 ("USB:
>> uas: Reduce can_queue to MAX_CMNDS"), "The uas driver can never queue
>> more then MAX_CMNDS...")
>
> OK, so try this as an exercise: Why would this not be the right thing
> to do after the host is prepared:  It has to do with the streams
> resources the driver has already created.
>
> James
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
James Bottomley May 23, 2016, 7:07 p.m. UTC | #5
On Tue, 2016-05-24 at 02:33 +0800, Tom Yan wrote:
> I don't quite get what you mean. Are you saying that it is impossible
> that UAS devices would report inappropriately high qdepth, because of
> this?
> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/
> drivers/usb/storage/uas.c?h=v4.6#n908

OK, you found the statement, now translate what it means to resource
allocation and it will show you why the if you proposed to add would
always be true.

James

> In that case should I send another patch that simply has `.can_queue
> =
> MAX_CMNDS` in the host template removed?
> 
> On 24 May 2016 at 01:27, James Bottomley
> <James.Bottomley@hansenpartnership.com> wrote:
> > On Tue, 2016-05-24 at 01:23 +0800, Tom Yan wrote:
> > > Nothing wrong. It's just .can_queue = MAX_CMNDS in the host
> > > template
> > > is no longer neceesary, since with his patch, uas will set
> > > can_queue
> > > again later (to devinfo->qdepth - 2).
> > > 
> > > Originally I thought .can_queue = MAX_CMNDS can hence be removed;
> > > but
> > > after a second thought, I think it might probably be better if we
> > > leave it there and make use of it, in case certain device somehow
> > > inapproriately reports an enormous qdepth (i.e. larger than
> > > MAX_CMNDS). (According to the commit message of 55ff8cfbc4e1
> > > ("USB:
> > > uas: Reduce can_queue to MAX_CMNDS"), "The uas driver can never
> > > queue
> > > more then MAX_CMNDS...")
> > 
> > OK, so try this as an exercise: Why would this not be the right
> > thing
> > to do after the host is prepared:  It has to do with the streams
> > resources the driver has already created.
> > 
> > James
> > 
> > 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi"
> in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
index 4d49fce..d7790e6 100644
--- a/drivers/usb/storage/uas.c
+++ b/drivers/usb/storage/uas.c
@@ -972,7 +972,8 @@  static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
 	 * 1 tag is reserved for untagged commands +
 	 * 1 tag to avoid off by one errors in some bridge firmwares
 	 */
-	shost->can_queue = devinfo->qdepth - 2;
+	if (devinfo->qdepth - 2 < MAX_CMNDS)
+		shost->can_queue = devinfo->qdepth - 2;
 
 	usb_set_intfdata(intf, shost);
 	result = scsi_add_host(shost, &intf->dev);