From: Ladislav Michl <ladis@linux-mips.org>
To: linux-usb@vger.kernel.org
Cc: Felipe Balbi <balbi@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: [PATCH 1/3] usb: gadget: u_serial: Fix console_req complete event race
Date: Wed, 3 Jul 2019 18:34:33 +0200 [thread overview]
Message-ID: <20190703163433.GB28579@lenoch> (raw)
In-Reply-To: <20190703163355.GA28579@lenoch>
gs_complete_out might be called before con_lock following usb_ep_queue
is locked, which prevents any future output on the console. Fix that by
resetting req_busy only if usb_ep_queue fails. While there also put
variable access we are racing with connection/disconnection events
under con_lock as well.
Fixes: a5beaaf39455 ("usb: gadget: Add the console support for usb-to-serial port")
Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
---
drivers/usb/gadget/function/u_serial.c | 38 +++++++++++---------------
1 file changed, 16 insertions(+), 22 deletions(-)
diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c
index 65f634ec7fc2..f8abb9c68e62 100644
--- a/drivers/usb/gadget/function/u_serial.c
+++ b/drivers/usb/gadget/function/u_serial.c
@@ -984,47 +984,41 @@ static int gs_console_thread(void *data)
struct gs_port *port;
struct usb_request *req;
struct usb_ep *ep;
- int xfer, ret, count, size;
+ int len, size, status;
+ spin_lock_irq(&info->con_lock);
do {
port = info->port;
set_current_state(TASK_INTERRUPTIBLE);
- if (!port || !port->port_usb
- || !port->port_usb->in || !info->console_req)
+ if (!port || !port->port_usb || !info->console_req)
goto sched;
req = info->console_req;
ep = port->port_usb->in;
-
- spin_lock_irq(&info->con_lock);
- count = kfifo_len(&info->con_buf);
- size = ep->maxpacket;
-
- if (count > 0 && !info->req_busy) {
+ len = kfifo_len(&info->con_buf);
+ if (len > 0 && !info->req_busy) {
set_current_state(TASK_RUNNING);
- if (count < size)
- size = count;
+ size = ep->maxpacket;
+ if (len < size)
+ size = len;
- xfer = kfifo_out(&info->con_buf, req->buf, size);
- req->length = xfer;
-
- spin_unlock(&info->con_lock);
- ret = usb_ep_queue(ep, req, GFP_ATOMIC);
- spin_lock(&info->con_lock);
- if (ret < 0)
- info->req_busy = 0;
- else
- info->req_busy = 1;
+ req->length = kfifo_out(&info->con_buf, req->buf, size);
+ info->req_busy = 1;
spin_unlock_irq(&info->con_lock);
+ status = usb_ep_queue(ep, req, GFP_ATOMIC);
+ spin_lock_irq(&info->con_lock);
+ if (status < 0)
+ info->req_busy = 0;
} else {
- spin_unlock_irq(&info->con_lock);
sched:
+ spin_unlock_irq(&info->con_lock);
if (kthread_should_stop()) {
set_current_state(TASK_RUNNING);
break;
}
schedule();
+ spin_lock_irq(&info->con_lock);
}
} while (1);
--
2.20.1
next prev parent reply other threads:[~2019-07-03 16:34 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-03 16:33 [PATCH 0/3] usb: gadget: u_serial: Fix and cleanup Ladislav Michl
2019-07-03 16:34 ` Ladislav Michl [this message]
2019-07-03 16:34 ` [PATCH 2/3] usb: gadget: u_serial: Remove console specific alloc/free req functions Ladislav Michl
2019-07-03 16:35 ` [PATCH 3/3] usb: gadget: u_serial: Use bool for req_busy Ladislav Michl
2019-07-04 16:32 ` [PATCH 0/3] usb: gadget: u_serial: Fix and cleanup Ladislav Michl
2019-07-04 22:10 ` Ladislav Michl
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190703163433.GB28579@lenoch \
--to=ladis@linux-mips.org \
--cc=balbi@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-usb@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).