diff mbox series

[v3,5/5] usb: gadget: u_serial: diagnose missed console messages

Message ID 3702f809d397892d91479f80e5f74d6d30345208.1551264094.git.mirq-linux@rere.qmqm.pl (mailing list archive)
State New, archived
Headers show
Series usb: gadget: u_serial: console for multiple ports | expand

Commit Message

Michał Mirosław Feb. 27, 2019, 10:46 a.m. UTC
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: Michał Mirosław <mirq-linux@rere.qmqm.pl>

---
  v3: added example output
    + lowecase 'missed'
  v2: commit message massage
---
 drivers/usb/gadget/function/u_serial.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

Comments

Greg KH Feb. 27, 2019, 1:07 p.m. UTC | #1
On Wed, Feb 27, 2019 at 11:46:59AM +0100, Michał Mirosław wrote:
> 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: Michał Mirosław <mirq-linux@rere.qmqm.pl>

Thanks for the changes here.

Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
diff mbox series

Patch

diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c
index 994882861db7..9e143bd081b6 100644
--- a/drivers/usb/gadget/function/u_serial.c
+++ b/drivers/usb/gadget/function/u_serial.c
@@ -88,6 +88,7 @@  struct gs_console {
 	spinlock_t		lock;
 	struct usb_request	*req;
 	struct kfifo		buf;
+	size_t			missed;
 };
 
 /*
@@ -930,6 +931,15 @@  static void __gs_console_push(struct gs_console *cons)
 	if (!size)
 		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;
 	if (usb_ep_queue(ep, req, GFP_ATOMIC))
 		req->length = 0;
@@ -951,10 +961,13 @@  static void gs_console_write(struct console *co,
 {
 	struct gs_console *cons = container_of(co, struct gs_console, console);
 	unsigned long flags;
+	size_t n;
 
 	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)
 		schedule_work(&cons->work);