svn commit: r323942 - head/sys/net
Hans Petter Selasky
hps at selasky.org
Sun Sep 24 08:53:04 UTC 2017
On 09/24/17 01:46, Stephen Hurd wrote:
> 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.
>
Can such a similar logic be applied inside TCP LRO aswell?
--HPS
More information about the svn-src-all
mailing list