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.c...@freescale.com>
---
  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.

Best regards,
--
Krzysztof Opasiak
Samsung R&D Institute Poland
Samsung Electronics
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to