Messages in this thread | | | Date | Fri, 14 Aug 2015 09:53:17 +0200 | From | Mike Looijmans <> | Subject | Re: [PATCH] usb/gadget/function/u_ether.c: Allow jumbo frames |
| |
ping...
More than a week has passed, haven't seen any response though. Any comments?
On 05-08-15 08:54, Mike Looijmans wrote: > USB network adapters support Jumbo frames. The only thing blocking > that feature is the code in the gadget driver that disposes of > packets larger than 1518 bytes, and the limit on the ioctl to set > the mtu. > > This patch relaxes these limits, and allows up to 15k frames sizes. > The 15k value was chosen because 16k does not work on all platforms, > and usingclose to 16k will result in allocating 5 or 8 4k pages to > store the skb, wasting pages at no measurable performance gain. > > On a topic-miami board (Zynq-7000), iperf3 performance reports: > MTU= 1500, PC-to-gadget: 139 Mbps, Gadget-to-PC: 116 Mbps > MTU=15000, PC-to-gadget: 239 Mbps, Gadget-to-PC: 361 Mbps > > On boards with slower CPUs the performance improvement will be > relatively much larger, e.g. an OMAP-L138 increased from 40 to > 220 Mbps using a similar patch on an 2.6.37 kernel. > > Signed-off-by: Mike Looijmans <mike.looijmans@topic.nl> > --- > drivers/usb/gadget/function/u_ether.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c > index f1fd777..6828ea2 100644 > --- a/drivers/usb/gadget/function/u_ether.c > +++ b/drivers/usb/gadget/function/u_ether.c > @@ -48,6 +48,11 @@ > > #define UETH__VERSION "29-May-2008" > > +/* Experiments show that both Linux and Windows hosts allow up to 16k > + * frame sizes. Set the max size to 15k+52 to prevent allocating 32k > + * blocks and still have efficient handling. */ > +#define GETHER_MAX_ETH_FRAME_LEN 15412 > + > struct eth_dev { > /* lock is held while accessing port_usb > */ > @@ -146,7 +151,7 @@ static int ueth_change_mtu(struct net_device *net, int new_mtu) > spin_lock_irqsave(&dev->lock, flags); > if (dev->port_usb) > status = -EBUSY; > - else if (new_mtu <= ETH_HLEN || new_mtu > ETH_FRAME_LEN) > + else if (new_mtu <= ETH_HLEN || new_mtu > GETHER_MAX_ETH_FRAME_LEN) > status = -ERANGE; > else > net->mtu = new_mtu; > @@ -294,7 +299,7 @@ static void rx_complete(struct usb_ep *ep, struct usb_request *req) > while (skb2) { > if (status < 0 > || ETH_HLEN > skb2->len > - || skb2->len > VLAN_ETH_FRAME_LEN) { > + || skb2->len > GETHER_MAX_ETH_FRAME_LEN) { > dev->net->stats.rx_errors++; > dev->net->stats.rx_length_errors++; > DBG(dev, "rx length %d\n", skb2->len); >
Kind regards,
Mike Looijmans System Expert
TOPIC Embedded Products Eindhovenseweg 32-C, NL-5683 KH Best Postbus 440, NL-5680 AK Best Telefoon: +31 (0) 499 33 69 79 Telefax: +31 (0) 499 33 69 70 E-mail: mike.looijmans@topicproducts.com Website: www.topicproducts.com
Please consider the environment before printing this e-mail
| |