Commit ef9b457d authored by Michał Mirosław's avatar Michał Mirosław Committed by Felipe Balbi

usb: gadget: u_serial: diagnose missed console messages

Insert markers in console stream marking places where data
is missing. This makes the hole in the data stand out clearly
instead of glueing together unrelated messages.

Example output as seen from USB host side:

[    0.064078] pinctrl core: registered pin 16 (UART3_RTS_N PC0) on 70000868.pinmux
[    0.064130] pinctrl
[missed 114987 bytes]
[    4.302299] udevd[134]: starting version 3.2.5
[    4.306845] random: udevd: uninitialized urandom read (16 bytes read)
Signed-off-by: default avatarMichał Mirosław <mirq-linux@rere.qmqm.pl>
Reviewed-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
parent bd25a14e
...@@ -88,6 +88,7 @@ struct gs_console { ...@@ -88,6 +88,7 @@ struct gs_console {
spinlock_t lock; spinlock_t lock;
struct usb_request *req; struct usb_request *req;
struct kfifo buf; struct kfifo buf;
size_t missed;
}; };
/* /*
...@@ -931,6 +932,15 @@ static void __gs_console_push(struct gs_console *cons) ...@@ -931,6 +932,15 @@ static void __gs_console_push(struct gs_console *cons)
if (!size) if (!size)
return; return;
if (cons->missed && ep->maxpacket >= 64) {
char buf[64];
size_t len;
len = sprintf(buf, "\n[missed %zu bytes]\n", cons->missed);
kfifo_in(&cons->buf, buf, len);
cons->missed = 0;
}
req->length = size; req->length = size;
if (usb_ep_queue(ep, req, GFP_ATOMIC)) if (usb_ep_queue(ep, req, GFP_ATOMIC))
req->length = 0; req->length = 0;
...@@ -952,10 +962,13 @@ static void gs_console_write(struct console *co, ...@@ -952,10 +962,13 @@ static void gs_console_write(struct console *co,
{ {
struct gs_console *cons = container_of(co, struct gs_console, console); struct gs_console *cons = container_of(co, struct gs_console, console);
unsigned long flags; unsigned long flags;
size_t n;
spin_lock_irqsave(&cons->lock, flags); spin_lock_irqsave(&cons->lock, flags);
kfifo_in(&cons->buf, buf, count); n = kfifo_in(&cons->buf, buf, count);
if (n < count)
cons->missed += count - n;
if (cons->req && !cons->req->length) if (cons->req && !cons->req->length)
schedule_work(&cons->work); schedule_work(&cons->work);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment