Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 Aug 2013 12:11:08 -0700
From:      Navdeep Parhar <np@FreeBSD.org>
To:        "freebsd-net@freebsd.org" <freebsd-net@freebsd.org>
Subject:   Please review: LRO entry last-active timestamp.
Message-ID:  <521510CC.3040104@FreeBSD.org>

next in thread | raw e-mail | index | archive | help
I'd like to add a last-active timestamp to the structure that tracks the
LRO state in a NIC's rx handler.  This is r254336 in user/np/cxl_tuning
that will be merged to head if there are no objections.

http://svnweb.freebsd.org/base?view=revision&revision=254336
http://svnweb.freebsd.org/base/user/np/cxl_tuning/sys/netinet/tcp_lro.c?r1=254336&r2=254335&pathrev=254336
http://svnweb.freebsd.org/base/user/np/cxl_tuning/sys/netinet/tcp_lro.h?r1=254336&r2=254335&pathrev=254336


-----
Add a last-modified timestamp to each LRO entry and provide an interface
to flush all inactive entries.  Drivers decide when to flush and what
the inactivity threshold should be.

Network drivers that process an rx queue to completion can enter a
livelock type situation when the rate at which packets are received
reaches equilibrium with the rate at which the rx thread is processing
them.  When this happens the final LRO flush (normally when the rx
routine is done) does not occur.  Pure ACKs and segments with total
payload < 64K can get stuck in an LRO entry.  Symptoms are that TCP
tx-mostly connections' performance falls off a cliff during heavy,
unrelated rx on the interface.

Flushing only inactive LRO entries works better than any of these
alternates that I tried:
- don't LRO pure ACKs
- flush _all_ LRO entries periodically (every 'x' microseconds or every
  'y' descriptors)
- stop rx processing in the driver periodically and schedule remaining
  work for later.
-----


Regards,
Navdeep



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?521510CC.3040104>