[PATCH v2 4/4] USB: EHCI: support running URB giveback in tasklet context

Ming Lei ming.lei at canonical.com
Mon Jun 24 09:14:09 EDT 2013


On Mon, Jun 24, 2013 at 9:06 PM, Oliver Neukum <oliver at neukum.org> wrote:
> On Monday 24 June 2013 20:58:26 Ming Lei wrote:
>> On Mon, Jun 24, 2013 at 6:24 PM, Oliver Neukum <oliver at neukum.org> wrote:
>> > On Monday 24 June 2013 17:42:05 Ming Lei wrote:
>> >> All 4 transfer types can work well on EHCI HCD after switching to run
>> >> URB giveback in tasklet context, so mark all HCD drivers to support
>> >> it.
>> >>
>> >> At the same time, don't release ehci->lock during URB giveback,
>> >> and remove the check on HCD_BH in ehci_disable_event().
>> >>
>> >> From below test results on 3 machines(2 ARM and one x86), time
>> >> consumed by EHCI interrupt handler droped much without performance
>> >> loss.
>> >>
>> >> 1 test description
>> >> 1.1 mass storage performance test:
>> >> - run below command 10 times and compute the average performance
>> >>
>> >>     dd if=/dev/sdN iflag=direct of=/dev/null bs=200M count=1
>> >
>> > It would be nice to get worst case numbers. How bad does it get
>> > if you reduce the sg size in usb-storage from 120K to 4K?
>>
>> A quick test on one arm A15 box shows that the average speed over
>> 10 times 'dd' becomes 8.0MB/sec from 8.160MB/sec when 'bs'
>> parameter of 'dd' changes to 4K, so there is ~1.9% performance
>> loss with the patch under the worst case.
>>
>> Same test on my T410(x86), the speed difference is only 40K.
>>
>> I will collect the worst case numbers and include it in the commit
>> log of V3.
>
> Sorry,
>
> I was referring to scsiglue.c
>
> struct scsi_host_template usb_stor_host_template = {
>         /* basic userland interface stuff */
>         .name =                         "usb-storage",
>         .proc_name =                    "usb-storage",
>         .proc_info =                    proc_info,
>         .info =                         host_info,
>
>         /* command interface -- queued only */
>         .queuecommand =                 queuecommand,
>
>         /* error and abort handlers */
>         .eh_abort_handler =             command_abort,
>         .eh_device_reset_handler =      device_reset,
>         .eh_bus_reset_handler =         bus_reset,
>
>         /* queue commands only, only one command per LUN */
>         .can_queue =                    1,
>         .cmd_per_lun =                  1,
>
>         /* unknown initiator id */
>         .this_id =                      -1,
>
>         .slave_alloc =                  slave_alloc,
>         .slave_configure =              slave_configure,
>
>         /* lots of sg segments can be handled */
>         .sg_tablesize =                 SCSI_MAX_SG_CHAIN_SEGMENTS,
>
>         /* limit the total size of a transfer to 120 KB */
>         .max_sectors =                  240,
>
> If you go to 8 sectors here, you should get the absolute worst case.

If you check trace of usbmon, 'dd if=/dev/sda iflag=direct bs=4k count=xxx'
generates the 4k data stage per transfer(cbw/data/csw).

So there is no difference between them.

Thanks,
--
Ming Lei



More information about the linux-arm-kernel mailing list