svn commit: r303837 - in head/sys: dev/mlx5/mlx5_en modules/mlx5en
Hans Petter Selasky
hselasky at FreeBSD.org
Mon Aug 8 16:22:18 UTC 2016
Author: hselasky
Date: Mon Aug 8 16:22:16 2016
New Revision: 303837
URL: https://svnweb.freebsd.org/changeset/base/303837
Log:
Switch to the new block based LRO input function for the mlx5en
driver. This change significantly increases the overall RX aggregation
ratio for heavily loaded networks handling 10-80 thousand simultaneous
connections.
Remove the turbo LRO code and all references to it which has now been
superceeded by the tcp_lro_queue_mbuf() function.
Tested by: Netflix
Sponsored by: Mellanox Technologies
MFC after: 1 week
Deleted:
head/sys/dev/mlx5/mlx5_en/tcp_tlro.c
head/sys/dev/mlx5/mlx5_en/tcp_tlro.h
Modified:
head/sys/dev/mlx5/mlx5_en/en.h
head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
head/sys/dev/mlx5/mlx5_en/mlx5_en_rx.c
head/sys/modules/mlx5en/Makefile
Modified: head/sys/dev/mlx5/mlx5_en/en.h
==============================================================================
--- head/sys/dev/mlx5/mlx5_en/en.h Mon Aug 8 16:19:24 2016 (r303836)
+++ head/sys/dev/mlx5/mlx5_en/en.h Mon Aug 8 16:22:16 2016 (r303837)
@@ -59,10 +59,6 @@
#include <machine/bus.h>
-#ifdef HAVE_TURBO_LRO
-#include "tcp_tlro.h"
-#endif
-
#include <dev/mlx5/driver.h>
#include <dev/mlx5/qp.h>
#include <dev/mlx5/cq.h>
@@ -460,11 +456,7 @@ struct mlx5e_rq {
struct ifnet *ifp;
struct mlx5e_rq_stats stats;
struct mlx5e_cq cq;
-#ifdef HAVE_TURBO_LRO
- struct tlro_ctrl lro;
-#else
struct lro_ctrl lro;
-#endif
volatile int enabled;
int ix;
Modified: head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
==============================================================================
--- head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c Mon Aug 8 16:19:24 2016 (r303836)
+++ head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c Mon Aug 8 16:22:16 2016 (r303837)
@@ -666,10 +666,15 @@ mlx5e_create_rq(struct mlx5e_channel *c,
}
wq_sz = mlx5_wq_ll_get_size(&rq->wq);
+
+ err = -tcp_lro_init_args(&rq->lro, c->ifp, TCP_LRO_ENTRIES, wq_sz);
+ if (err)
+ goto err_rq_wq_destroy;
+
rq->mbuf = malloc(wq_sz * sizeof(rq->mbuf[0]), M_MLX5EN, M_WAITOK | M_ZERO);
if (rq->mbuf == NULL) {
err = -ENOMEM;
- goto err_rq_wq_destroy;
+ goto err_lro_init;
}
for (i = 0; i != wq_sz; i++) {
struct mlx5e_rx_wqe *wqe = mlx5_wq_ll_get_wqe(&rq->wq, i);
@@ -694,20 +699,12 @@ mlx5e_create_rq(struct mlx5e_channel *c,
mlx5e_create_stats(&rq->stats.ctx, SYSCTL_CHILDREN(priv->sysctl_ifnet),
buffer, mlx5e_rq_stats_desc, MLX5E_RQ_STATS_NUM,
rq->stats.arg);
-
-#ifdef HAVE_TURBO_LRO
- if (tcp_tlro_init(&rq->lro, c->ifp, MLX5E_BUDGET_MAX) != 0)
- rq->lro.mbuf = NULL;
-#else
- if (tcp_lro_init(&rq->lro))
- rq->lro.lro_cnt = 0;
- else
- rq->lro.ifp = c->ifp;
-#endif
return (0);
err_rq_mbuf_free:
free(rq->mbuf, M_MLX5EN);
+err_lro_init:
+ tcp_lro_free(&rq->lro);
err_rq_wq_destroy:
mlx5_wq_destroy(&rq->wq_ctrl);
err_free_dma_tag:
@@ -726,11 +723,8 @@ mlx5e_destroy_rq(struct mlx5e_rq *rq)
sysctl_ctx_free(&rq->stats.ctx);
/* free leftover LRO packets, if any */
-#ifdef HAVE_TURBO_LRO
- tcp_tlro_free(&rq->lro);
-#else
tcp_lro_free(&rq->lro);
-#endif
+
wq_sz = mlx5_wq_ll_get_size(&rq->wq);
for (i = 0; i != wq_sz; i++) {
if (rq->mbuf[i].mbuf != NULL) {
Modified: head/sys/dev/mlx5/mlx5_en/mlx5_en_rx.c
==============================================================================
--- head/sys/dev/mlx5/mlx5_en/mlx5_en_rx.c Mon Aug 8 16:19:24 2016 (r303836)
+++ head/sys/dev/mlx5/mlx5_en/mlx5_en_rx.c Mon Aug 8 16:22:16 2016 (r303837)
@@ -369,15 +369,9 @@ mlx5e_poll_rx_cq(struct mlx5e_rq *rq, in
mlx5e_build_rx_mbuf(cqe, rq, mb, byte_cnt);
rq->stats.packets++;
-#ifdef HAVE_TURBO_LRO
- if (mb->m_pkthdr.csum_flags == 0 ||
- (rq->ifp->if_capenable & IFCAP_LRO) == 0 ||
- rq->lro.mbuf == NULL) {
- /* normal input */
- rq->ifp->if_input(rq->ifp, mb);
- } else {
- tcp_tlro_rx(&rq->lro, mb);
- }
+
+#if !defined(HAVE_TCP_LRO_RX)
+ tcp_lro_queue_mbuf(&rq->lro, mb);
#else
if (mb->m_pkthdr.csum_flags == 0 ||
(rq->ifp->if_capenable & IFCAP_LRO) == 0 ||
@@ -395,9 +389,6 @@ wq_ll_pop:
/* ensure cq space is freed before enabling more cqes */
wmb();
-#ifndef HAVE_TURBO_LRO
- tcp_lro_flush_all(&rq->lro);
-#endif
return (i);
}
@@ -437,8 +428,6 @@ mlx5e_rx_cq_comp(struct mlx5_core_cq *mc
}
mlx5e_post_rx_wqes(rq);
mlx5e_cq_arm(&rq->cq);
-#ifdef HAVE_TURBO_LRO
- tcp_tlro_flush(&rq->lro, 1);
-#endif
+ tcp_lro_flush_all(&rq->lro);
mtx_unlock(&rq->mtx);
}
Modified: head/sys/modules/mlx5en/Makefile
==============================================================================
--- head/sys/modules/mlx5en/Makefile Mon Aug 8 16:19:24 2016 (r303836)
+++ head/sys/modules/mlx5en/Makefile Mon Aug 8 16:22:16 2016 (r303837)
@@ -12,15 +12,14 @@ mlx5_en_txrx.c \
device_if.h bus_if.h vnode_if.h pci_if.h \
opt_inet.h opt_inet6.h opt_rss.h
-.if defined(HAVE_TURBO_LRO)
-CFLAGS+= -DHAVE_TURBO_LRO
-SRCS+= tcp_tlro.c
-.endif
-
.if defined(HAVE_PER_CQ_EVENT_PACKET)
CFLAGS+= -DHAVE_PER_CQ_EVENT_PACKET
.endif
+.if defined(HAVE_TCP_LRO_RX)
+CFLAGS+= -DHAVE_TCP_LRO_RX
+.endif
+
CFLAGS+= -I${.CURDIR}/../../ofed/include
CFLAGS+= -I${.CURDIR}/../../compat/linuxkpi/common/include
More information about the svn-src-head
mailing list