[U-Boot] usb_test_unit_ready called every block read - performance

Steve Heckman
2012-08-15T16:45:37Z

Oh yeah, forgot about that...;)

I just downloaded the ext4 branch tarball and built it.

The test_unit_ready calls were still in there.

With or without those it took 0m 45s to load a ~150MB image.

In our original branch (2011.12), the test_unit_ready calls had more of an
impact. The stock 2011.12 u-boot image took 6m 22s to load the 150MB file.
Without test_unit_ready, it took 3m 15s. Without test_unit_ready and
wait_ms(5) in usb_stor_BBB_transport() it took 0m 16s.

In the ext4 branch, I removed test_unit_ready and the mdelay(5) call
from usb_stor_BBB_transport() function and was able to load the same file
in 0m 8s.

So, removing the mdelay(5) call is the biggest improvement. Removing both
is the best.

To recap:

with w/o w/o
TUR TUR TUR and 5ms wait
2011.12 6:25 3:15 0:16
ext4 0:45 0:45 0:08

Note: all these time include the 3-4 seconds it takes to do the "usb start".

Regards,
-Steve

On Wed, Aug 15, 2012 at 10:19 AM, Jim Shimer <mgi2475@motorola.com> wrote:

> Hi Marek,
>
> I looked at the ext4 branch. It looks like he has the patch to remove the
> usb_test_unit_ready() calls which were not needed. Actually those calls are
> commented out on that branch:
> #if 0
> if (usb_test_unit_ready(srb, ss)) {
> printf("Device NOT ready\n Request Sense returned %02X
> %02X"
> " %02X\n", srb->sense_buf[2], srb->sense_buf[12],
> srb->sense_buf[13]);
> return 0;
> }
> #endif
>
> In the u-boot-usb.git, this code is removed so at some point there will be
> a merge conflict.
>
> Also the ext4 branch still has the mdelay(5) always being done in
> usb_stor_BBB_transport() line 696 which we found to be the largest
> performance killer.
>
> Regards,
> Jim
>
>
> On Sun, Aug 12, 2012 at 7:54 PM, Marek Vasut <marex@denx.de> wrote:
>
>> Dear Jim Shimer,
>>
>> > While tuning ext2load, we found that usb_test_unit_ready was being
>> called
>> > every block read. We compared the usb block storage to the scsi block
>> > storage cmd_scsi.c, and found that the scsi device was only calling its
>> > scsi_setup_test_unit_ready() during scsi_can. It appears that
>> > usb_test_unit_ready() really only needs to be called once during
>> > usb_stor_scan(), via usb_stor_get_info(). Is there a particular reason
>> > usb_test_unit_ready is called for every block read, or do you think its
>> ok
>> > to only call during usb_stor_scan()? We're finding this speeds up
>> ext2load
>> > quite a bit.
>>
>> Jim, did we get anywhere on this one ? Can you try with the new ext4 code
>> in
>> Wolfgangs' u-boot-master/ext4 branch?
>>
>> > Regards,
>> > Jim
>>
>> Best regards,
>> Marek Vasut
>>
>
>
>
> --
> *James H Shimer*
> Motorola Mobility T3-12-HH72
> 900 Chelmsford Street
> Lowell MA 08151
> 978-614-3550
>
>