summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordavidcs <davidcs@FreeBSD.org>2017-08-24 18:01:17 +0000
committerdavidcs <davidcs@FreeBSD.org>2017-08-24 18:01:17 +0000
commitf5df8ed1a19970254d73e6c9392345338bd9ad6f (patch)
treeb79009a18dba8ffe6dec8fc4de9fc3001223714e
parent43efaa575dd7f7229aa72a8170ab0086fbd20f6a (diff)
downloadFreeBSD-src-f5df8ed1a19970254d73e6c9392345338bd9ad6f.zip
FreeBSD-src-f5df8ed1a19970254d73e6c9392345338bd9ad6f.tar.gz
MFC r322331
Provide compile option to choose receive processing in either Ithread or Taskqueue Thread. Approved by: re(marius)
-rw-r--r--sys/dev/qlnx/qlnxe/qlnx_os.c162
-rw-r--r--sys/dev/qlnx/qlnxe/qlnx_ver.h2
-rw-r--r--sys/modules/qlnx/qlnxe/Makefile1
3 files changed, 122 insertions, 43 deletions
diff --git a/sys/dev/qlnx/qlnxe/qlnx_os.c b/sys/dev/qlnx/qlnxe/qlnx_os.c
index 2e9ecf2..56433e1 100644
--- a/sys/dev/qlnx/qlnxe/qlnx_os.c
+++ b/sys/dev/qlnx/qlnxe/qlnx_os.c
@@ -397,9 +397,13 @@ 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;
@@ -419,54 +423,59 @@ 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;
-
- lro = &fp->rxq->lro;
+ {
+ struct lro_ctrl *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);
@@ -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;
diff --git a/sys/dev/qlnx/qlnxe/qlnx_ver.h b/sys/dev/qlnx/qlnxe/qlnx_ver.h
index 0dff764..6fc8b57 100644
--- a/sys/dev/qlnx/qlnxe/qlnx_ver.h
+++ b/sys/dev/qlnx/qlnxe/qlnx_ver.h
@@ -39,5 +39,5 @@
#define QLNX_VERSION_MAJOR 1
#define QLNX_VERSION_MINOR 4
-#define QLNX_VERSION_BUILD 5
+#define QLNX_VERSION_BUILD 6
diff --git a/sys/modules/qlnx/qlnxe/Makefile b/sys/modules/qlnx/qlnxe/Makefile
index f800441..5e02bff 100644
--- a/sys/modules/qlnx/qlnxe/Makefile
+++ b/sys/modules/qlnx/qlnxe/Makefile
@@ -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>
OpenPOWER on IntegriCloud