1. 25 10月, 2012 9 次提交
    • H
      3151f209
    • H
      ehci: Retry to fill the queue while waiting for td completion · b4ea8664
      Hans de Goede 提交于
      If the guest is using multiple transfers to try and keep the usb bus busy /
      used at maximum efficiency, currently we would see / do the following:
      
      1) submit transfer 1 to the device
      2) submit transfer 2 to the device
      3) report transfer 1 completion to guest
      4) report transfer 2 completion to guest
      5) submit transfer 1 to the device
      6) report transfer 1 completion to guest
      7) submit transfer 2 to the device
      8) report transfer 2 completion to guest
      etc.
      
      So after the initial submission we would effectively only have 1 transfer
      in flight, rather then 2. This is caused by us not checking the queue for
      addition of new transfers by the guest (ie the resubmission of a recently
      finished transfer), while waiting for a pending transfer to complete.
      This patch does add a check for this, changing the sequence to:
      
      1) submit transfer 1 to the device
      2) submit transfer 2 to the device
      3) report transfer 1 completion to guest
      4) submit transfer 1 to the device
      5) report transfer 2 completion to guest
      6) submit transfer 2 to the device
      etc.
      
      Thus keeping 2 transfers in flight (most of the time, and always 1),
      as intended by the guest.
      Signed-off-by: NHans de Goede <hdegoede@redhat.com>
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      b4ea8664
    • H
      ehci: Detect going in circles when filling the queue · e3a36bce
      Hans de Goede 提交于
      For ctrl endpoints Windows (atleast Win7) creates circular td lists, so far
      these were not a problem because we would stop filling the queue if altnext
      was set. Since further patches in this patchset remove the altnext check this
      does become a problem and we need detection for going in circles.
      Signed-off-by: NHans de Goede <hdegoede@redhat.com>
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      e3a36bce
    • H
      ehci: Speed up the timer of raising int from the async schedule · 44272b0f
      Hans de Goede 提交于
      Often the guest will queue up new packets in response to a packet, in the
      async schedule with its IOC flag set, completing. By speeding up the
      frame-timer, we notice these new packets earlier. This increases the
      speed (MB/s) of a Linux guest reading from a USB mass storage device by a
      factor of 1.15 on top of the "Improve latency of interrupt delivery"
      speed-ups, both with and without input pipelining enabled.
      
      I've not tested the speed-up of this patch without the
      "Improve latency of interrupt delivery" patch.
      Signed-off-by: NHans de Goede <hdegoede@redhat.com>
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      44272b0f
    • H
      ehci: Improve latency of interrupt delivery and async schedule scanning · 0262f65a
      Hans de Goede 提交于
      While doing various performance tests of reading from USB mass storage devices
      I noticed the following::
      1) When an async handled packet completes, we don't immediately report an
         interrupt to the guest, instead we wait for the frame-timer to run and
         report it from there
      2) If 1) has been fixed and an async handled packet takes a while to complete,
         then async_stepdown will become a high value, which means that there
         will be a large latency before any new packets queued by the guest in
         response to the interrupt get seen
      
      1) was done deliberately as part of commit f0ad01f9:
      http://www.kraxel.org/cgit/qemu/commit/?h=usb.57&id=f0ad01f92ca02eee7cadbfd225c5de753ebd5fce
      Since setting the interrupt immediately on async packet completion was causing
      issues with Linux guests, I believe this recently fixed Linux bug explains
      why this is happening:
      http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commitdiff;h=361aabf395e4a23cf554cf4ec0c0c6963b8beb01
      
      Note that we can *not* count on this fix being present in all Linux guests!
      
      I was hoping that the recently added support for Interrupt Threshold Control
      would fix the issues with Linux guests, but adding a simple ehci_commit_irq()
      call to ehci_async_bh() still caused problems with Linux guests.
      
      The problem is, that when doing ehci_commit_irq() from ehci_async_bh(),
      the "old" frindex value is used to calculate usbsts_frindex, and when
      the frame-timer then runs possibly very shortly after ehci_async_bh(),
      it increases the frame-timer, and thus any interrupts raised from that
      frame-timer run, will also get reported to the guest immediately, rather
      then being delayed to the next frame-timer run.
      
      Luckily the solution for this is simple, this means that we need to
      increase frindex before calling ehci_commit_irq() from ehci_async_bh(),
      which in the end boils down to simple calling ehci_frame_timer() instead
      of ehci_async_bh() from the bh.
      
      This may seem like it causes a lot of extra work to be done, but this
      is not true. Any work done from the frame-timer processing the periodic
      schedule is work which then does not need to be done the next time the
      frame timer runs, also the frame-timer will re-arm itself at (possibly)
      a later time then it was armed for saving a vmexit at that time.
      
      As an additional advantage moving to simply calling the frame-timer also
      fixes 2) as the packet completion will set async_stepdown to 0, and the
      re-arming of the timer with an async_stepdown of 0 ensures that any
      newly queued up packets get seen in a reasonable amount of time.
      
      This improves the speed (MB/s) of a Linux guest reading from a USB mass
      storage device by a factor of 1.5 - 1.7 with input pipelining disabled,
      and by a factor of 1.8 with input pipelining enabled.
      Signed-off-by: NHans de Goede <hdegoede@redhat.com>
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      0262f65a
    • H
      ehci: Set int flag on a short input packet · cf08a8a1
      Hans de Goede 提交于
      According to 4.15.1.2 an interrupt must be raised when a short packet
      is received. If we don't do this it may take a significant time for
      the guest to notice a short trasnfer has completed, since only the last td
      will have its IOC flag set, and a short transfer may complete in an earlier
      packet.
      Signed-off-by: NHans de Goede <hdegoede@redhat.com>
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      cf08a8a1
    • H
      ehci: Get rid of packet tbytes field · 549a3c3d
      Hans de Goede 提交于
      This field is used in some places to track the tbytes field of the token, but
      in other places the field is used directly, use it directly everywhere for
      consistency.
      Signed-off-by: NHans de Goede <hdegoede@redhat.com>
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      549a3c3d
    • H
      uhci: Move checks to continue queuing to uhci_fill_queue() · 7c2eaca4
      Hans de Goede 提交于
      Rather then having a special check to start queuing after the first packet,
      and then another check for the other packets in uhci_fill_queue(), simply
      check the previous packet beforehand in uhci_fill_queue()
      Signed-off-by: NHans de Goede <hdegoede@redhat.com>
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      7c2eaca4
    • H
      uhci: Properly unmap packets on cancel / invalid pid · 00a0770d
      Hans de Goede 提交于
      Packets with an invalid pid, or which were cancelled have
      usb_packet_map() called on them on init, but not usb_packet_unmap()
      before being freed.
      Signed-off-by: NHans de Goede <hdegoede@redhat.com>
      Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
      00a0770d
  2. 23 10月, 2012 13 次提交
  3. 22 10月, 2012 11 次提交
  4. 20 10月, 2012 7 次提交