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