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
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to