[Differential] [Request, 6 lines] D4825: tcp/lro: Add network driver configurable LRO entry depth
sepherosa_gmail.com (Sepherosa Ziehau)
phabric-noreply at FreeBSD.org
Fri Jan 8 02:29:22 UTC 2016
sepherosa_gmail.com created this revision.
sepherosa_gmail.com added reviewers: network, adrian, delphij, decui_microsoft.com, honzhan_microsoft.com, howard0su_gmail.com, glebius.
sepherosa_gmail.com added a subscriber: freebsd-net-list.
Herald added a reviewer: transport.
REVISION SUMMARY
When there is only tiny amount of TCP connections and the host is slow, e.g. in VM, holding too much TCP segments in an LRO entry will cause RX performance degradation. We now allow network drivers to configure how deep one LRO entry should be.
https://reviews.freebsd.org/D4824 has a disabled network driver usage example.
Reviewed by: Hongjiang Zhang <honzhan microsoft com>, Dexuan Cui <decui microsoft com>, Jun Su <junsu microsoft com>
Tested by: me (local), Hongjiang Zhang <honzhan microsoft com> (directly connected 40Ge)
Sponsored by: Microsoft OSTC
BTW, I think some drivers already put a limit on the # of drivers holding TCP segments, e.g. oce(4), though oce(4) does not use per-LRO entry depth.
REVISION DETAIL
https://reviews.freebsd.org/D4825
AFFECTED FILES
sys/netinet/tcp_lro.c
sys/netinet/tcp_lro.h
CHANGE DETAILS
diff --git a/sys/netinet/tcp_lro.h b/sys/netinet/tcp_lro.h
--- a/sys/netinet/tcp_lro.h
+++ b/sys/netinet/tcp_lro.h
@@ -79,6 +79,7 @@
int lro_flushed;
int lro_bad_csum;
int lro_cnt;
+ int lro_hiwat;
struct lro_head lro_active;
struct lro_head lro_free;
diff --git a/sys/netinet/tcp_lro.c b/sys/netinet/tcp_lro.c
--- a/sys/netinet/tcp_lro.c
+++ b/sys/netinet/tcp_lro.c
@@ -77,6 +77,7 @@
lc->lro_queued = 0;
lc->lro_flushed = 0;
lc->lro_cnt = 0;
+ lc->lro_hiwat = 65535;
SLIST_INIT(&lc->lro_free);
SLIST_INIT(&lc->lro_active);
@@ -501,7 +502,7 @@
}
/* Flush now if appending will result in overflow. */
- if (le->p_len > (65535 - tcp_data_len)) {
+ if (le->p_len > (lc->lro_hiwat - tcp_data_len)) {
SLIST_REMOVE(&lc->lro_active, le, lro_entry, next);
tcp_lro_flush(lc, le);
break;
@@ -559,7 +560,7 @@
* If a possible next full length packet would cause an
* overflow, pro-actively flush now.
*/
- if (le->p_len > (65535 - lc->ifp->if_mtu)) {
+ if (le->p_len > (lc->lro_hiwat - lc->ifp->if_mtu)) {
SLIST_REMOVE(&lc->lro_active, le, lro_entry, next);
tcp_lro_flush(lc, le);
} else
EMAIL PREFERENCES
https://reviews.freebsd.org/settings/panel/emailpreferences/
To: sepherosa_gmail.com, network, transport, adrian, delphij, decui_microsoft.com, honzhan_microsoft.com, howard0su_gmail.com, glebius
Cc: freebsd-net-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D4825.12026.patch
Type: text/x-patch
Size: 1152 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-net/attachments/20160108/55028aa2/attachment.bin>
More information about the freebsd-net
mailing list