Re: [PATCH 1/3] usb: gadget: f_sourcesink: add queue depth

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Nov 16, 2015 at 05:56:25PM +0100, Krzysztof Opasiak wrote:
> 
> 
> On 11/13/2015 09:00 AM, Peter Chen wrote:
> >Add queue depth for both iso and bulk transfer, with more queues, we
> >can do performance and stress test using sourcesink, and update g_zero
> >accordingly.
> >
> >Signed-off-by: Peter Chen <peter.chen@xxxxxxxxxxxxx>
> >---
> >  drivers/usb/gadget/function/f_sourcesink.c | 144 ++++++++++++++++++++++-------
> >  drivers/usb/gadget/function/g_zero.h       |   6 ++
> >  drivers/usb/gadget/legacy/zero.c           |  12 +++
> >  3 files changed, 129 insertions(+), 33 deletions(-)
> >
> >diff --git a/drivers/usb/gadget/function/f_sourcesink.c b/drivers/usb/gadget/function/f_sourcesink.c
> >index d7646d3..4ab603e8 100644
> >--- a/drivers/usb/gadget/function/f_sourcesink.c
> >+++ b/drivers/usb/gadget/function/f_sourcesink.c
> >@@ -34,13 +34,6 @@
> >   * plus two that support control-OUT tests.  If the optional "autoresume"
> >   * mode is enabled, it provides good functional coverage for the "USBCV"
> >   * test harness from USB-IF.
> >- *
> >- * Note that because this doesn't queue more than one request at a time,
> >- * some other function must be used to test queueing logic.  The network
> >- * link (g_ether) is the best overall option for that, since its TX and RX
> >- * queues are relatively independent, will receive a range of packet sizes,
> >- * and can often be made to run out completely.  Those issues are important
> >- * when stress testing peripheral controller drivers.
> >   */
> >  struct f_sourcesink {
> >  	struct usb_function	function;
> >@@ -57,6 +50,8 @@ struct f_sourcesink {
> >  	unsigned isoc_mult;
> >  	unsigned isoc_maxburst;
> >  	unsigned buflen;
> >+	unsigned bulk_qlen;
> >+	unsigned iso_qlen;
> >  };
> >
> >  static inline struct f_sourcesink *func_to_ss(struct usb_function *f)
> >@@ -595,31 +590,33 @@ static int source_sink_start_ep(struct f_sourcesink *ss, bool is_in,
> >  {
> >  	struct usb_ep		*ep;
> >  	struct usb_request	*req;
> >-	int			i, size, status;
> >-
> >-	for (i = 0; i < 8; i++) {
> >-		if (is_iso) {
> >-			switch (speed) {
> >-			case USB_SPEED_SUPER:
> >-				size = ss->isoc_maxpacket *
> >-						(ss->isoc_mult + 1) *
> >-						(ss->isoc_maxburst + 1);
> >-				break;
> >-			case USB_SPEED_HIGH:
> >-				size = ss->isoc_maxpacket * (ss->isoc_mult + 1);
> >-				break;
> >-			default:
> >-				size = ss->isoc_maxpacket > 1023 ?
> >-						1023 : ss->isoc_maxpacket;
> >-				break;
> >-			}
> >-			ep = is_in ? ss->iso_in_ep : ss->iso_out_ep;
> >-			req = ss_alloc_ep_req(ep, size);
> >-		} else {
> >-			ep = is_in ? ss->in_ep : ss->out_ep;
> >-			req = ss_alloc_ep_req(ep, 0);
> >+	int			i, size, qlen, status = 0;
> >+
> >+	if (is_iso) {
> >+		switch (speed) {
> >+		case USB_SPEED_SUPER:
> >+			size = ss->isoc_maxpacket *
> >+					(ss->isoc_mult + 1) *
> >+					(ss->isoc_maxburst + 1);
> >+			break;
> >+		case USB_SPEED_HIGH:
> >+			size = ss->isoc_maxpacket * (ss->isoc_mult + 1);
> >+			break;
> >+		default:
> >+			size = ss->isoc_maxpacket > 1023 ?
> >+					1023 : ss->isoc_maxpacket;
> >+			break;
> >  		}
> >+		ep = is_in ? ss->iso_in_ep : ss->iso_out_ep;
> >+		qlen = ss->iso_qlen;
> >+	} else {
> >+		ep = is_in ? ss->in_ep : ss->out_ep;
> >+		qlen = ss->bulk_qlen;
> >+		size = 0;
> >+	}
> >
> >+	for (i = 0; i < qlen; i++) {
> >+		req = ss_alloc_ep_req(ep, size);
> >  		if (!req)
> >  			return -ENOMEM;
> >
> >@@ -639,9 +636,6 @@ static int source_sink_start_ep(struct f_sourcesink *ss, bool is_in,
> >  			      ep->name, status);
> >  			free_ep_req(ep, req);
> 
> Well... to be honest I would prefer to return here an error instead
> of silently try with another request as we may end up in situation
> that qlen is 8 and we haven't successfully enqueued any request but
> we treat this as a success.
> 

Ok, but it seems not related with this patch set, I will change after
this one has queued.

-- 

Best Regards,
Peter Chen
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux