On Thu, Aug 6, 2020 at 9:17 AM Lorenzo Colitti <lorenzo@xxxxxxxxxx> wrote: > > The u_ether driver has a qmult setting that multiplies the > transmit queue length (which by default is 2). > > The intent is that it should be enabled at high/super speed, but > because the code does not explicitly check for USB_SUPER_PLUS, > it is disabled at that speed. > > Fix this by ensuring that the queue multiplier is enabled for any > wired link at high speed or above. Using >= for USB_SPEED_* > constants seems correct because it is what the gadget_is_xxxspeed > functions do. > > The queue multiplier substantially helps performance at higher > speeds. On a direct SuperSpeed Plus link to a Linux laptop, > iperf3 single TCP stream: > > Before (qmult=1): 1.3 Gbps > After (qmult=5): 3.2 Gbps > > Signed-off-by: Lorenzo Colitti <lorenzo@xxxxxxxxxx> > --- > drivers/usb/gadget/function/u_ether.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c > index c3cc6bd14e..31ea76adcc 100644 > --- a/drivers/usb/gadget/function/u_ether.c > +++ b/drivers/usb/gadget/function/u_ether.c > @@ -93,7 +93,7 @@ struct eth_dev { > static inline int qlen(struct usb_gadget *gadget, unsigned qmult) > { > if (gadget_is_dualspeed(gadget) && (gadget->speed == USB_SPEED_HIGH || > - gadget->speed == USB_SPEED_SUPER)) > + gadget->speed >= USB_SPEED_SUPER)) > return qmult * DEFAULT_QLEN; > else > return DEFAULT_QLEN; > -- > 2.28.0.163.g6104cc2f0b6-goog > Reviewed-by: Maciej Żenczykowski <maze@xxxxxxxxxx> Though I think this probably deserves a fixes tag of some sort. Probably: Fixes: 04617db7aa68 ("usb: gadget: add SS descriptors to Ethernet gadget") since that's the commit that did: -MODULE_PARM_DESC(qmult, "queue length multiplier at high speed"); +MODULE_PARM_DESC(qmult, "queue length multiplier at high/super speed"); ... -/* for dual-speed hardware, use deeper queues at highspeed */ +/* for dual-speed hardware, use deeper queues at high/super speed */ static inline int qlen(struct usb_gadget *gadget) { - if (gadget_is_dualspeed(gadget) && gadget->speed == USB_SPEED_HIGH) + if (gadget_is_dualspeed(gadget) && (gadget->speed == USB_SPEED_HIGH || + gadget->speed == USB_SPEED_SUPER)) return qmult * DEFAULT_QLEN; else return DEFAULT_QLEN;