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

Marek Vasut
2012-08-18T23:17:15Z

Dear Steve Heckman,

> 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".

Coolness ! :-) Please just retest by applying those ext4 patches on top of uboot
usb and see how fast it goes :)

> 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