diff options
author | Alan Cox <alan@linux.intel.com> | 2009-07-09 13:35:52 +0100 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-07-10 19:17:22 -0700 |
commit | 4cd1de0afaaa45309f34d7282ea4c07d9b56a3ff (patch) | |
tree | 73bf4ddaee7ec059ea3e9be38c13cfb61ce1af47 /drivers/usb/serial/generic.c | |
parent | d6be791cbd4d6a96f0ec1c8c44166038c76d1330 (diff) | |
download | op-kernel-dev-4cd1de0afaaa45309f34d7282ea4c07d9b56a3ff.zip op-kernel-dev-4cd1de0afaaa45309f34d7282ea4c07d9b56a3ff.tar.gz |
tty: Sort out the USB sysrq changes that wrecked performance
We can't go around calling all sorts of magic per character functions at
full rate 3G data speed.
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/usb/serial/generic.c')
-rw-r--r-- | drivers/usb/serial/generic.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index 932d624..3d8dc56 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c @@ -424,10 +424,17 @@ static void flush_and_resubmit_read_urb(struct usb_serial_port *port) if (!tty) goto done; - /* Push data to tty */ - for (i = 0; i < urb->actual_length; i++, ch++) { - if (!usb_serial_handle_sysrq_char(port, *ch)) - tty_insert_flip_char(tty, *ch, TTY_NORMAL); + /* The per character mucking around with sysrq path it too slow for + stuff like 3G modems, so shortcircuit it in the 99.9999999% of cases + where the USB serial is not a console anyway */ + if (!port->console || !port->sysrq) + tty_insert_flip_string(tty, ch, urb->actual_length); + else { + /* Push data to tty */ + for (i = 0; i < urb->actual_length; i++, ch++) { + if (!usb_serial_handle_sysrq_char(port, *ch)) + tty_insert_flip_char(tty, *ch, TTY_NORMAL); + } } tty_flip_buffer_push(tty); tty_kref_put(tty); |