[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 14/17] usb-redir: Dynamically adjust iso buffering s
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH 14/17] usb-redir: Dynamically adjust iso buffering size based on ep interval |
Date: |
Fri, 13 Jan 2012 11:18:31 +0100 |
From: Hans de Goede <address@hidden>
Note the bufpq_target_size id stored in the endpoint info struct,
even though it only used once. This is done because it will be
referenced from other code in a follow up patch.
Signed-off-by: Hans de Goede <address@hidden>
Signed-off-by: Gerd Hoffmann <address@hidden>
---
usb-redir.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 48 insertions(+), 5 deletions(-)
diff --git a/usb-redir.c b/usb-redir.c
index 81a35c6..99a12d5 100644
--- a/usb-redir.c
+++ b/usb-redir.c
@@ -61,6 +61,7 @@ struct endp_data {
uint8_t interrupt_started;
uint8_t interrupt_error;
QTAILQ_HEAD(, buf_packet) bufpq;
+ int bufpq_target_size;
};
struct USBRedirDevice {
@@ -332,15 +333,42 @@ static int usbredir_handle_iso_data(USBRedirDevice *dev,
USBPacket *p,
uint8_t ep)
{
int status, len;
-
if (!dev->endpoint[EP2I(ep)].iso_started &&
!dev->endpoint[EP2I(ep)].iso_error) {
struct usb_redir_start_iso_stream_header start_iso = {
.endpoint = ep,
- /* TODO maybe do something with these depending on ep interval? */
- .pkts_per_urb = 32,
- .no_urbs = 3,
};
+ int pkts_per_sec;
+
+ if (dev->dev.speed == USB_SPEED_HIGH) {
+ pkts_per_sec = 8000 / dev->endpoint[EP2I(ep)].interval;
+ } else {
+ pkts_per_sec = 1000 / dev->endpoint[EP2I(ep)].interval;
+ }
+ /* Testing has shown that we need circa 60 ms buffer */
+ dev->endpoint[EP2I(ep)].bufpq_target_size = (pkts_per_sec * 60) / 1000;
+
+ /* Aim for approx 100 interrupts / second on the client to
+ balance latency and interrupt load */
+ start_iso.pkts_per_urb = pkts_per_sec / 100;
+ if (start_iso.pkts_per_urb < 1) {
+ start_iso.pkts_per_urb = 1;
+ } else if (start_iso.pkts_per_urb > 32) {
+ start_iso.pkts_per_urb = 32;
+ }
+
+ start_iso.no_urbs = (dev->endpoint[EP2I(ep)].bufpq_target_size +
+ start_iso.pkts_per_urb - 1) /
+ start_iso.pkts_per_urb;
+ /* Output endpoints pre-fill only 1/2 of the packets, keeping the rest
+ as overflow buffer. Also see the usbredir protocol documentation */
+ if (!(ep & USB_DIR_IN)) {
+ start_iso.no_urbs *= 2;
+ }
+ if (start_iso.no_urbs > 16) {
+ start_iso.no_urbs = 16;
+ }
+
/* No id, we look at the ep when receiving a status back */
usbredirparser_send_start_iso_stream(dev->parser, 0, &start_iso);
usbredirparser_do_write(dev->parser);
@@ -961,9 +989,24 @@ static void usbredir_ep_info(void *priv,
dev->endpoint[i].type = ep_info->type[i];
dev->endpoint[i].interval = ep_info->interval[i];
dev->endpoint[i].interface = ep_info->interface[i];
- if (dev->endpoint[i].type != usb_redir_type_invalid) {
+ switch (dev->endpoint[i].type) {
+ case usb_redir_type_invalid:
+ break;
+ case usb_redir_type_iso:
+ case usb_redir_type_interrupt:
+ if (dev->endpoint[i].interval == 0) {
+ ERROR("Received 0 interval for isoc or irq endpoint\n");
+ usbredir_device_disconnect(dev);
+ }
+ /* Fall through */
+ case usb_redir_type_control:
+ case usb_redir_type_bulk:
DPRINTF("ep: %02X type: %d interface: %d\n", I2EP(i),
dev->endpoint[i].type, dev->endpoint[i].interface);
+ break;
+ default:
+ ERROR("Received invalid endpoint type\n");
+ usbredir_device_disconnect(dev);
}
}
}
--
1.7.1
- [Qemu-devel] [PULL 00/17] usb patch queue: audio, xhci, usbredir, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 08/17] usb: add ifnum to USBEndpoint, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 12/17] usb: link packets to endpoints not devices, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 01/17] usb-host: rip out legacy procfs support, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 17/17] usb-redir: Improve some debugging messages, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 04/17] usb-desc: audio endpoint support, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 10/17] usb/debug: add usb_ep_dump, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 09/17] usb-desc: USBEndpoint support, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 14/17] usb-redir: Dynamically adjust iso buffering size based on ep interval,
Gerd Hoffmann <=
- [Qemu-devel] [PATCH 16/17] usb-redir: Try to keep our buffer size near the target size, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 02/17] usb: track configuration and interface count in USBDevice., Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 15/17] usb-redir: Pre-fill our isoc input buffer before sending pkts to the host, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 07/17] usb: add USBEndpoint, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 06/17] xhci: Initial xHCI implementation, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 05/17] usb: add audio device model, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 13/17] usb-redir: Clear iso / irq error when stopping the stream, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 03/17] usb: track altsetting in USBDevice, Gerd Hoffmann, 2012/01/13
- [Qemu-devel] [PATCH 11/17] usb: add max_packet_size to USBEndpoint, Gerd Hoffmann, 2012/01/13
- Re: [Qemu-devel] [PULL 00/17] usb patch queue: audio, xhci, usbredir, Anthony Liguori, 2012/01/13