Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Aug 2017 17:36:10 +0000 (UTC)
From:      David C Somayajulu <davidcs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r322849 - in stable/11/sys: dev/qlnx/qlnxe modules/qlnx/qlnxe
Message-ID:  <201708241736.v7OHaATM099032@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: davidcs
Date: Thu Aug 24 17:36:10 2017
New Revision: 322849
URL: https://svnweb.freebsd.org/changeset/base/322849

Log:
  MFC r322331
  Provide compile option to choose receive processing in either Ithread or
  Taskqueue Thread.

Modified:
  stable/11/sys/dev/qlnx/qlnxe/qlnx_os.c
  stable/11/sys/dev/qlnx/qlnxe/qlnx_ver.h
  stable/11/sys/modules/qlnx/qlnxe/Makefile
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/dev/qlnx/qlnxe/qlnx_os.c
==============================================================================
--- stable/11/sys/dev/qlnx/qlnxe/qlnx_os.c	Thu Aug 24 17:25:16 2017	(r322848)
+++ stable/11/sys/dev/qlnx/qlnxe/qlnx_os.c	Thu Aug 24 17:36:10 2017	(r322849)
@@ -397,10 +397,14 @@ qlnx_fp_taskqueue(void *context, int pending)
         struct ifnet		*ifp;
         struct mbuf		*mp;
         int			ret;
+	struct thread		*cthread;
+
+#ifdef QLNX_RCV_IN_TASKQ
 	int			lro_enable;
 	int			rx_int = 0, total_rx_count = 0;
-	struct thread		*cthread;
 
+#endif /* #ifdef QLNX_RCV_IN_TASKQ */
+
         fp = context;
 
         if (fp == NULL)
@@ -419,55 +423,60 @@ qlnx_fp_taskqueue(void *context, int pending)
 
         ifp = ha->ifp;
 
-	lro_enable = ha->ifp->if_capenable & IFCAP_LRO;
+#ifdef QLNX_RCV_IN_TASKQ
+	{
+		lro_enable = ifp->if_capenable & IFCAP_LRO;
 
-	rx_int = qlnx_rx_int(ha, fp, ha->rx_pkt_threshold, lro_enable);
+		rx_int = qlnx_rx_int(ha, fp, ha->rx_pkt_threshold, lro_enable);
 
-	if (rx_int) {
-		fp->rx_pkts += rx_int;
-		total_rx_count += rx_int;
-	}
+		if (rx_int) {
+			fp->rx_pkts += rx_int;
+			total_rx_count += rx_int;
+		}
 
 #ifdef QLNX_SOFT_LRO
-	{
-		struct lro_ctrl *lro;
+		{
+			struct lro_ctrl *lro;
+	
+			lro = &fp->rxq->lro;
 
-		lro = &fp->rxq->lro;
+			if (lro_enable && total_rx_count) {
 
-		if (lro_enable && total_rx_count) {
-
 #if (__FreeBSD_version >= 1100101) || (defined QLNX_QSORT_LRO)
 
-			if (ha->dbg_trace_lro_cnt) {
-				if (lro->lro_mbuf_count & ~1023)
-					fp->lro_cnt_1024++;
-				else if (lro->lro_mbuf_count & ~511)
-					fp->lro_cnt_512++;
-				else if (lro->lro_mbuf_count & ~255)
-					fp->lro_cnt_256++;
-				else if (lro->lro_mbuf_count & ~127)
-					fp->lro_cnt_128++;
-				else if (lro->lro_mbuf_count & ~63)
-					fp->lro_cnt_64++;
-			}
-			tcp_lro_flush_all(lro);
+				if (ha->dbg_trace_lro_cnt) {
+					if (lro->lro_mbuf_count & ~1023)
+						fp->lro_cnt_1024++;
+					else if (lro->lro_mbuf_count & ~511)
+						fp->lro_cnt_512++;
+					else if (lro->lro_mbuf_count & ~255)
+						fp->lro_cnt_256++;
+					else if (lro->lro_mbuf_count & ~127)
+						fp->lro_cnt_128++;
+					else if (lro->lro_mbuf_count & ~63)
+						fp->lro_cnt_64++;
+				}
+				tcp_lro_flush_all(lro);
 
 #else
-			struct lro_entry *queued;
+				struct lro_entry *queued;
 
-			while ((!SLIST_EMPTY(&lro->lro_active))) {
-				queued = SLIST_FIRST(&lro->lro_active);
-				SLIST_REMOVE_HEAD(&lro->lro_active, next);
-				tcp_lro_flush(lro, queued);
-			}
+				while ((!SLIST_EMPTY(&lro->lro_active))) {
+					queued = SLIST_FIRST(&lro->lro_active);
+					SLIST_REMOVE_HEAD(&lro->lro_active, next);
+					tcp_lro_flush(lro, queued);
+				}
 #endif /* #if (__FreeBSD_version >= 1100101) || (defined QLNX_QSORT_LRO) */
+			}
 		}
-	}
 #endif /* #ifdef QLNX_SOFT_LRO */
 
-	ecore_sb_update_sb_idx(fp->sb_info);
-	rmb();
+		ecore_sb_update_sb_idx(fp->sb_info);
+		rmb();
+	}
 
+#endif /* #ifdef QLNX_RCV_IN_TASKQ */
+
         mtx_lock(&fp->tx_mtx);
 
         if (((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
@@ -477,10 +486,6 @@ qlnx_fp_taskqueue(void *context, int pending)
                 goto qlnx_fp_taskqueue_exit;
         }
 
-//	for (tc = 0; tc < ha->num_tc; tc++) {
-//		(void)qlnx_tx_int(ha, fp, fp->txq[tc]);
-//	}
-
         mp = drbr_peek(ifp, fp->tx_br);
 
         while (mp != NULL) {
@@ -516,13 +521,11 @@ qlnx_fp_taskqueue(void *context, int pending)
                 mp = drbr_peek(ifp, fp->tx_br);
         }
 
-//	for (tc = 0; tc < ha->num_tc; tc++) {
-//		(void)qlnx_tx_int(ha, fp, fp->txq[tc]);
-//	}
-
         mtx_unlock(&fp->tx_mtx);
 
 qlnx_fp_taskqueue_exit:
+
+#ifdef QLNX_RCV_IN_TASKQ
 	if (rx_int) {
 		if (fp->fp_taskqueue != NULL)
 			taskqueue_enqueue(fp->fp_taskqueue, &fp->fp_task);
@@ -532,6 +535,7 @@ qlnx_fp_taskqueue_exit:
 		}
 		ecore_sb_ack(fp->sb_info, IGU_INT_ENABLE, 1);
 	}
+#endif /* #ifdef QLNX_RCV_IN_TASKQ */
 
         QL_DPRINT2(ha, "exit ret = %d\n", ret);
         return;
@@ -4262,6 +4266,7 @@ next_cqe:	/* don't consume bd rx buffer */
         return rx_pkt;
 }
 
+
 /*
  * fast path interrupt
  */
@@ -4292,9 +4297,82 @@ qlnx_fp_isr(void *arg)
         if (fp == NULL) {
                 ha->err_fp_null++;
         } else {
+
+#ifdef QLNX_RCV_IN_TASKQ
                 ecore_sb_ack(fp->sb_info, IGU_INT_DISABLE, 0);
 		if (fp->fp_taskqueue != NULL)
 			taskqueue_enqueue(fp->fp_taskqueue, &fp->fp_task);
+#else
+		int	rx_int = 0, total_rx_count = 0;
+		int 	lro_enable, tc;
+
+		lro_enable = ha->ifp->if_capenable & IFCAP_LRO;
+
+                ecore_sb_ack(fp->sb_info, IGU_INT_DISABLE, 0);
+
+                do {
+                        for (tc = 0; tc < ha->num_tc; tc++) {
+                                if (mtx_trylock(&fp->tx_mtx)) {
+                                        qlnx_tx_int(ha, fp, fp->txq[tc]);
+                                        mtx_unlock(&fp->tx_mtx);
+                                }
+                        }
+
+                        rx_int = qlnx_rx_int(ha, fp, ha->rx_pkt_threshold,
+                                        lro_enable);
+
+                        if (rx_int) {
+                                fp->rx_pkts += rx_int;
+                                total_rx_count += rx_int;
+                        }
+
+                } while (rx_int);
+
+
+#ifdef QLNX_SOFT_LRO
+                {
+                        struct lro_ctrl *lro;
+
+                        lro = &fp->rxq->lro;
+
+                        if (lro_enable && total_rx_count) {
+
+#if (__FreeBSD_version >= 1100101) || (defined QLNX_QSORT_LRO)
+
+#ifdef QLNX_TRACE_LRO_CNT
+                                if (lro->lro_mbuf_count & ~1023)
+                                        fp->lro_cnt_1024++;
+                                else if (lro->lro_mbuf_count & ~511)
+                                        fp->lro_cnt_512++;
+                                else if (lro->lro_mbuf_count & ~255)
+                                        fp->lro_cnt_256++;
+                                else if (lro->lro_mbuf_count & ~127)
+                                        fp->lro_cnt_128++;
+                                else if (lro->lro_mbuf_count & ~63)
+                                        fp->lro_cnt_64++;
+#endif /* #ifdef QLNX_TRACE_LRO_CNT */
+
+                                tcp_lro_flush_all(lro);
+
+#else
+                                struct lro_entry *queued;
+
+                                while ((!SLIST_EMPTY(&lro->lro_active))) {
+                                        queued = SLIST_FIRST(&lro->lro_active);
+                                        SLIST_REMOVE_HEAD(&lro->lro_active, \
+                                                next);
+                                        tcp_lro_flush(lro, queued);
+                                }
+#endif /* #if (__FreeBSD_version >= 1100101) || (defined QLNX_QSORT_LRO) */
+                        }
+                }
+#endif /* #ifdef QLNX_SOFT_LRO */
+
+                ecore_sb_update_sb_idx(fp->sb_info);
+                rmb();
+                ecore_sb_ack(fp->sb_info, IGU_INT_ENABLE, 1);
+
+#endif /* #ifdef QLNX_RCV_IN_TASKQ */
         }
 
         return;

Modified: stable/11/sys/dev/qlnx/qlnxe/qlnx_ver.h
==============================================================================
--- stable/11/sys/dev/qlnx/qlnxe/qlnx_ver.h	Thu Aug 24 17:25:16 2017	(r322848)
+++ stable/11/sys/dev/qlnx/qlnxe/qlnx_ver.h	Thu Aug 24 17:36:10 2017	(r322849)
@@ -39,5 +39,5 @@
 
 #define QLNX_VERSION_MAJOR      1
 #define QLNX_VERSION_MINOR      4
-#define QLNX_VERSION_BUILD      5
+#define QLNX_VERSION_BUILD      6
 

Modified: stable/11/sys/modules/qlnx/qlnxe/Makefile
==============================================================================
--- stable/11/sys/modules/qlnx/qlnxe/Makefile	Thu Aug 24 17:25:16 2017	(r322848)
+++ stable/11/sys/modules/qlnx/qlnxe/Makefile	Thu Aug 24 17:36:10 2017	(r322849)
@@ -63,6 +63,7 @@ CFLAGS += -DECORE_CONFIG_DIRECT_HWFN
 #CFLAGS += -DQLNX_SOFT_LRO
 #CFLAGS += -DQLNX_QSORT_LRO
 #CFLAGS += -DQLNX_MAX_COALESCE
+#CFLAGS += -DQLNX_RCV_IN_TASKQ
 
 
 .include <bsd.kmod.mk>



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