mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
To: Felipe Balbi <balbi@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Shuah Khan <shuah@kernel.org>,
	Alan Stern <stern@rowland.harvard.edu>,
	Johan Hovold <johan@kernel.org>,
	Jaejoong Kim <climbbb.kim@gmail.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Roger Quadros <rogerq@ti.com>,
	Manu Gautam <mgautam@codeaurora.org>,
	<martin.petersen@oracle.com>,
	Bart Van Assche <bvanassche@acm.org>,
	Mike Christie <mchristi@redhat.com>,
	Matthew Wilcox <willy@infradead.org>,
	Colin Ian King <colin.king@canonical.com>
Cc: <linux-usb@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<v.anuragkumar@gmail.com>, Thinh Nguyen <thinhn@synopsys.com>,
	Tejas Joglekar <tejas.joglekar@synopsys.com>,
	Ajay Yugalkishore Pandey <APANDEY@xilinx.com>,
	Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
Subject: [PATCH v7 02/10] usb: gadget: function: tcm: Add timeout for stream capable endpoints
Date: Sat, 1 Dec 2018 16:43:23 +0530	[thread overview]
Message-ID: <1543662811-5194-3-git-send-email-anurag.kumar.vulisha@xilinx.com> (raw)
In-Reply-To: <1543662811-5194-1-git-send-email-anurag.kumar.vulisha@xilinx.com>

When stream transfers are enabled for an endpoint, there can
be a condition where the gadget controller waits for the host
to issue prime transaction and the host controller waits for
the gadget to issue ERDY. This condition could create a deadlock.
To avoid such potential deadlocks, use usb_ep_queue_timeout()
instead of usb_ep_queue() for stream capable endpoints. The
usb_ep_queue_timeout(), after queuing any request starts the timer
with STREAM_TIMEOUT_MS timeout value for the stream capable
endpoints. The gadget controller driver is expected to stop the
timer for every request if a valid stream event is found. If no
stream event is found, the timer expires after the STREAM_TIMEOUT_MS
value and a callback function registered by udc/core.c is called,
which handles the deadlock situation by dequeuing and requeuing the
request. This kind of behaviour is observed in dwc3 controller
and expected to be generic issue with other controllers supporting
bulk streams.

Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
---
 Changes in v7:
	1. This patch is newly added in this series
---
 drivers/usb/gadget/function/f_tcm.c | 25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/drivers/usb/gadget/function/f_tcm.c b/drivers/usb/gadget/function/f_tcm.c
index 106988a..6eaee04 100644
--- a/drivers/usb/gadget/function/f_tcm.c
+++ b/drivers/usb/gadget/function/f_tcm.c
@@ -27,6 +27,12 @@
 
 #define TPG_INSTANCES		1
 
+/*
+ * Timeout value in msecs passed as an argument to usb_ep_queue_timeout() for
+ * stream capable endpoints
+ */
+#define STREAM_TIMEOUT_MS	50
+
 struct tpg_instance {
 	struct usb_function_instance	*func_inst;
 	struct usbg_tpg			*tpg;
@@ -575,7 +581,8 @@ static void uasp_status_data_cmpl(struct usb_ep *ep, struct usb_request *req)
 		ret = uasp_prepare_r_request(cmd);
 		if (ret)
 			goto cleanup;
-		ret = usb_ep_queue(fu->ep_in, stream->req_in, GFP_ATOMIC);
+		ret = usb_ep_queue_timeout(fu->ep_in, stream->req_in,
+					   GFP_ATOMIC, STREAM_TIMEOUT_MS);
 		if (ret)
 			pr_err("%s(%d) => %d\n", __func__, __LINE__, ret);
 		break;
@@ -584,15 +591,16 @@ static void uasp_status_data_cmpl(struct usb_ep *ep, struct usb_request *req)
 		ret = usbg_prepare_w_request(cmd, stream->req_out);
 		if (ret)
 			goto cleanup;
-		ret = usb_ep_queue(fu->ep_out, stream->req_out, GFP_ATOMIC);
+		ret = usb_ep_queue_timeout(fu->ep_out, stream->req_out,
+					   GFP_ATOMIC, STREAM_TIMEOUT_MS);
 		if (ret)
 			pr_err("%s(%d) => %d\n", __func__, __LINE__, ret);
 		break;
 
 	case UASP_SEND_STATUS:
 		uasp_prepare_status(cmd);
-		ret = usb_ep_queue(fu->ep_status, stream->req_status,
-				GFP_ATOMIC);
+		ret = usb_ep_queue_timeout(fu->ep_status, stream->req_status,
+					   GFP_ATOMIC, STREAM_TIMEOUT_MS);
 		if (ret)
 			pr_err("%s(%d) => %d\n", __func__, __LINE__, ret);
 		break;
@@ -622,7 +630,8 @@ static int uasp_send_status_response(struct usbg_cmd *cmd)
 	stream->req_status->context = cmd;
 	cmd->fu = fu;
 	uasp_prepare_status(cmd);
-	return usb_ep_queue(fu->ep_status, stream->req_status, GFP_ATOMIC);
+	return usb_ep_queue_timeout(fu->ep_status, stream->req_status,
+				    GFP_ATOMIC, STREAM_TIMEOUT_MS);
 }
 
 static int uasp_send_read_response(struct usbg_cmd *cmd)
@@ -640,7 +649,8 @@ static int uasp_send_read_response(struct usbg_cmd *cmd)
 		ret = uasp_prepare_r_request(cmd);
 		if (ret)
 			goto out;
-		ret = usb_ep_queue(fu->ep_in, stream->req_in, GFP_ATOMIC);
+		ret = usb_ep_queue_timeout(fu->ep_in, stream->req_in,
+					   GFP_ATOMIC, STREAM_TIMEOUT_MS);
 		if (ret) {
 			pr_err("%s(%d) => %d\n", __func__, __LINE__, ret);
 			kfree(cmd->data_buf);
@@ -686,7 +696,8 @@ static int uasp_send_write_request(struct usbg_cmd *cmd)
 		ret = usbg_prepare_w_request(cmd, stream->req_out);
 		if (ret)
 			goto cleanup;
-		ret = usb_ep_queue(fu->ep_out, stream->req_out, GFP_ATOMIC);
+		ret = usb_ep_queue_timeout(fu->ep_out, stream->req_out,
+					   GFP_ATOMIC, STREAM_TIMEOUT_MS);
 		if (ret)
 			pr_err("%s(%d)\n", __func__, __LINE__);
 
-- 
2.1.1


  parent reply	other threads:[~2018-12-01 11:13 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-01 11:13 [PATCH v7 00/10] usb: dwc3: Fix broken BULK stream support to dwc3 gadget driver Anurag Kumar Vulisha
2018-12-01 11:13 ` [PATCH v7 01/10] usb: gadget: udc: Add timer support for usb requests Anurag Kumar Vulisha
2018-12-02 16:36   ` Alan Stern
2018-12-03 10:23     ` Anurag Kumar Vulisha
2018-12-03 14:51       ` Alan Stern
2018-12-03 16:05         ` Anurag Kumar Vulisha
2018-12-03 23:08           ` Alan Stern
2018-12-04 16:18             ` Anurag Kumar Vulisha
2018-12-04 16:46               ` Alan Stern
2018-12-04 19:07                 ` Anurag Kumar Vulisha
2018-12-04 19:28                   ` Alan Stern
2018-12-05 15:43                     ` Anurag Kumar Vulisha
2018-12-07  6:05                       ` Felipe Balbi
2018-12-07 17:09                         ` Alan Stern
2018-12-12 15:11                           ` Anurag Kumar Vulisha
2019-01-04 14:17                           ` Anurag Kumar Vulisha
2018-12-01 11:13 ` Anurag Kumar Vulisha [this message]
2018-12-01 11:13 ` [PATCH v7 03/10] usb: dwc3: gadget: handle stream events Anurag Kumar Vulisha
2018-12-01 11:13 ` [PATCH v7 04/10] usb: dwc3: update stream id in depcmd Anurag Kumar Vulisha
2018-12-01 11:13 ` [PATCH v7 05/10] usb: dwc3: make controller clear transfer resources after complete Anurag Kumar Vulisha
2018-12-05  9:01   ` Felipe Balbi
2018-12-05 19:05     ` Anurag Kumar Vulisha
2018-12-01 11:13 ` [PATCH v7 06/10] usb: dwc3: don't issue no-op trb for stream capable endpoints Anurag Kumar Vulisha
2018-12-01 11:13 ` [PATCH v7 07/10] usb: dwc3: check for requests in started list " Anurag Kumar Vulisha
2018-12-01 11:13 ` [PATCH v7 08/10] usb: dwc3: Correct the logic for checking TRB full in __dwc3_prepare_one_trb() Anurag Kumar Vulisha
2018-12-01 11:13 ` [PATCH v7 09/10] usb: dwc3: Check for IOC/LST bit in both event->status and TRB->ctrl fields Anurag Kumar Vulisha
2018-12-05  9:07   ` Felipe Balbi
2018-12-05 19:01     ` Anurag Kumar Vulisha
2018-12-07  6:11       ` Felipe Balbi
2018-12-08 19:03         ` Anurag Kumar Vulisha
2018-12-10  6:54           ` Felipe Balbi
2018-12-10  8:56             ` Anurag Kumar Vulisha
2018-12-10  9:03               ` Felipe Balbi
2018-12-01 11:13 ` [PATCH v7 10/10] usb: dwc3: Check MISSED ISOC bit only for ISOC endpoints Anurag Kumar Vulisha

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=1543662811-5194-3-git-send-email-anurag.kumar.vulisha@xilinx.com \
    --to=anurag.kumar.vulisha@xilinx.com \
    --cc=APANDEY@xilinx.com \
    --cc=balbi@kernel.org \
    --cc=benh@kernel.crashing.org \
    --cc=bvanassche@acm.org \
    --cc=climbbb.kim@gmail.com \
    --cc=colin.king@canonical.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=johan@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=mchristi@redhat.com \
    --cc=mgautam@codeaurora.org \
    --cc=rogerq@ti.com \
    --cc=shuah@kernel.org \
    --cc=stern@rowland.harvard.edu \
    --cc=tejas.joglekar@synopsys.com \
    --cc=thinhn@synopsys.com \
    --cc=v.anuragkumar@gmail.com \
    --cc=willy@infradead.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

all inboxes | Powered by JetHome®