svn commit: r323942 - head/sys/net

Stephen Hurd shurd at sasktel.net
Sun Sep 24 00:10:14 UTC 2017


Bjoern A. Zeeb wrote:
> On 23 Sep 2017, at 6:32, Stephen Hurd wrote:
>
>> Bjoern A. Zeeb wrote:
>>> On 23 Sep 2017, at 1:35, Stephen Hurd wrote:
>>>
>>>> Author: shurd
>>>> Date: Sat Sep 23 01:35:14 2017
>>>> New Revision: 323942
>>>> URL: https://svnweb.freebsd.org/changeset/base/323942
>>>>
>>>> Log:
>>>>    Chain mbufs before passing to if_input()
>>>>
>>>>    Build a list of mbufs to pass to if_input() after LRO. Results in
>>>>    12% small packet forwarding rate improvement.
>>> forwarding seems a confusing word here..
>>
>> The test was small (64 byte frames) received on one interface, then 
>> sent out on a different one using the net.inet.ip.forwarding sysctl 
>> (controlled via the gateway_enable setting in rc.conf).
>
> Then this makes no sense as we don’t do LRO if forwarding is enabled 
> on the machine;
> https://svnweb.freebsd.org/base/head/sys/netinet/tcp_lro.c?annotate=317390#l645

Basically, it changed from this:

foreach (mbuf in rx) {
   if (lro && tcp_lro_rx(mbuf) == 0)
     continue;
   if_input(mbuf)
}

To this:

prev_mbuf = first_mbuf = NULL;
foreach (mbuf in rx) {
   if (lro && tcp_lro_rx(mbuf) == 0)
     continue;
   if (prev_mbuf) {
     prev_mbuf->m_nextpkt = mbuf;
     prev_mbuf = mbuf;
   }
   else {
     first_mbuf = prev_mbuf = mbuf;
   }
}

if (first_mbuf)
   if_input(first_mbuf);

So while before it called if_input() for each separate mbuf that was not 
LROed, it now builds a chain of mbufs that were not LROed, and makes a 
single call to if_input() with the whole chain.  For cases like packet 
forwarding where no packets are LROed, performance is better.


More information about the svn-src-head mailing list