diff options
| author | Navdeep Parhar <np@FreeBSD.org> | 2018-05-17 01:42:18 +0000 |
|---|---|---|
| committer | Navdeep Parhar <np@FreeBSD.org> | 2018-05-17 01:42:18 +0000 |
| commit | eff62dba61f74d613340ad0505366f0c3866e95e (patch) | |
| tree | d336039afa312dc2d23d5ad9da5ecd5e23aca813 | |
| parent | fdf71aeb54aa2ef9233d6403d58d1d9d72470df8 (diff) | |
Notes
| -rw-r--r-- | sys/dev/cxgbe/t4_main.c | 54 | ||||
| -rw-r--r-- | sys/dev/cxgbe/t4_sge.c | 27 | ||||
| -rw-r--r-- | sys/modules/cxgbe/if_cxgbe/Makefile | 1 |
3 files changed, 58 insertions, 24 deletions
diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c index 5d486f55d267..95859ce001e4 100644 --- a/sys/dev/cxgbe/t4_main.c +++ b/sys/dev/cxgbe/t4_main.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include "opt_ddb.h" #include "opt_inet.h" #include "opt_inet6.h" +#include "opt_ratelimit.h" #include "opt_rss.h" #include <sys/param.h> @@ -269,7 +270,7 @@ TUNABLE_INT("hw.cxgbe.nrxq_vi", &t4_nrxq_vi); static int t4_rsrv_noflowq = 0; TUNABLE_INT("hw.cxgbe.rsrv_noflowq", &t4_rsrv_noflowq); -#ifdef TCP_OFFLOAD +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) #define NOFLDTXQ 8 static int t4_nofldtxq = -NOFLDTXQ; TUNABLE_INT("hw.cxgbe.nofldtxq", &t4_nofldtxq); @@ -499,7 +500,7 @@ struct intrs_and_queues { uint16_t nirq; /* Total # of vectors */ uint16_t ntxq; /* # of NIC txq's for each port */ uint16_t nrxq; /* # of NIC rxq's for each port */ - uint16_t nofldtxq; /* # of TOE txq's for each port */ + uint16_t nofldtxq; /* # of TOE/ETHOFLD txq's for each port */ uint16_t nofldrxq; /* # of TOE rxq's for each port */ /* The vcxgbe/vcxl interfaces use these and not the ones above. */ @@ -834,8 +835,11 @@ t4_attach(device_t dev) struct intrs_and_queues iaq; struct sge *s; uint32_t *buf; +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) + int ofld_tqidx; +#endif #ifdef TCP_OFFLOAD - int ofld_rqidx, ofld_tqidx; + int ofld_rqidx; #endif #ifdef DEV_NETMAP int nm_rqidx, nm_tqidx; @@ -1048,21 +1052,26 @@ t4_attach(device_t dev) s->neq = s->ntxq + s->nrxq; /* the free list in an rxq is an eq */ s->neq += nports + 1;/* ctrl queues: 1 per port + 1 mgmt */ s->niq = s->nrxq + 1; /* 1 extra for firmware event queue */ +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) + if (is_offload(sc) || is_ethoffload(sc)) { + s->nofldtxq = nports * iaq.nofldtxq; + if (num_vis > 1) + s->nofldtxq += nports * (num_vis - 1) * iaq.nofldtxq_vi; + s->neq += s->nofldtxq + s->nofldrxq; + s->ofld_txq = malloc(s->nofldtxq * sizeof(struct sge_wrq), + M_CXGBE, M_ZERO | M_WAITOK); + } +#endif #ifdef TCP_OFFLOAD if (is_offload(sc)) { s->nofldrxq = nports * iaq.nofldrxq; - s->nofldtxq = nports * iaq.nofldtxq; if (num_vis > 1) { s->nofldrxq += nports * (num_vis - 1) * iaq.nofldrxq_vi; - s->nofldtxq += nports * (num_vis - 1) * iaq.nofldtxq_vi; } - s->neq += s->nofldtxq + s->nofldrxq; s->niq += s->nofldrxq; s->ofld_rxq = malloc(s->nofldrxq * sizeof(struct sge_ofld_rxq), M_CXGBE, M_ZERO | M_WAITOK); - s->ofld_txq = malloc(s->nofldtxq * sizeof(struct sge_wrq), - M_CXGBE, M_ZERO | M_WAITOK); } #endif #ifdef DEV_NETMAP @@ -1101,8 +1110,11 @@ t4_attach(device_t dev) * tx queues that each port should get. */ rqidx = tqidx = 0; +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) + ofld_tqidx = 0; +#endif #ifdef TCP_OFFLOAD - ofld_rqidx = ofld_tqidx = 0; + ofld_rqidx = 0; #endif #ifdef DEV_NETMAP nm_rqidx = nm_tqidx = 0; @@ -1135,16 +1147,18 @@ t4_attach(device_t dev) else vi->rsrv_noflowq = 0; +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) + vi->first_ofld_txq = ofld_tqidx; + vi->nofldtxq = j == 0 ? iaq.nofldtxq : iaq.nofldtxq_vi; + ofld_tqidx += vi->nofldtxq; +#endif #ifdef TCP_OFFLOAD vi->ofld_tmr_idx = t4_tmr_idx_ofld; vi->ofld_pktc_idx = t4_pktc_idx_ofld; vi->first_ofld_rxq = ofld_rqidx; - vi->first_ofld_txq = ofld_tqidx; vi->nofldrxq = j == 0 ? iaq.nofldrxq : iaq.nofldrxq_vi; - vi->nofldtxq = j == 0 ? iaq.nofldtxq : iaq.nofldtxq_vi; ofld_rqidx += vi->nofldrxq; - ofld_tqidx += vi->nofldtxq; #endif #ifdef DEV_NETMAP if (j > 0) { @@ -1361,9 +1375,11 @@ t4_detach_common(device_t dev) if (sc->l2t) t4_free_l2t(sc->l2t); +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) + free(sc->sge.ofld_txq, M_CXGBE); +#endif #ifdef TCP_OFFLOAD free(sc->sge.ofld_rxq, M_CXGBE); - free(sc->sge.ofld_txq, M_CXGBE); #endif #ifdef DEV_NETMAP free(sc->sge.nm_rxq, M_CXGBE); @@ -2793,10 +2809,14 @@ calculate_iaq(struct adapter *sc, struct intrs_and_queues *iaq, int itype, iaq->ntxq_vi = t4_ntxq_vi; iaq->nrxq = t4_nrxq; iaq->nrxq_vi = t4_nrxq_vi; -#ifdef TCP_OFFLOAD - if (is_offload(sc)) { +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) + if (is_offload(sc) || is_ethoffload(sc)) { iaq->nofldtxq = t4_nofldtxq; iaq->nofldtxq_vi = t4_nofldtxq_vi; + } +#endif +#ifdef TCP_OFFLOAD + if (is_offload(sc)) { iaq->nofldrxq = t4_nofldrxq; iaq->nofldrxq_vi = t4_nofldrxq_vi; } @@ -9657,9 +9677,11 @@ tweak_tunables(void) calculate_nqueues(&t4_nrxq_vi, nc, NRXQ_VI); -#ifdef TCP_OFFLOAD +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) calculate_nqueues(&t4_nofldtxq, nc, NOFLDTXQ); calculate_nqueues(&t4_nofldtxq_vi, nc, NOFLDTXQ_VI); +#endif +#ifdef TCP_OFFLOAD calculate_nqueues(&t4_nofldrxq, nc, NOFLDRXQ); calculate_nqueues(&t4_nofldrxq_vi, nc, NOFLDRXQ_VI); diff --git a/sys/dev/cxgbe/t4_sge.c b/sys/dev/cxgbe/t4_sge.c index 58ad1cec9c51..ae78e166c426 100644 --- a/sys/dev/cxgbe/t4_sge.c +++ b/sys/dev/cxgbe/t4_sge.c @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include "opt_inet.h" #include "opt_inet6.h" +#include "opt_ratelimit.h" #include <sys/types.h> #include <sys/eventhandler.h> @@ -224,7 +225,7 @@ static int free_nm_txq(struct vi_info *, struct sge_nm_txq *); #endif static int ctrl_eq_alloc(struct adapter *, struct sge_eq *); static int eth_eq_alloc(struct adapter *, struct vi_info *, struct sge_eq *); -#ifdef TCP_OFFLOAD +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) static int ofld_eq_alloc(struct adapter *, struct vi_info *, struct sge_eq *); #endif static int alloc_eq(struct adapter *, struct vi_info *, struct sge_eq *); @@ -1045,6 +1046,8 @@ t4_setup_vi_queues(struct vi_info *vi) struct sge_wrq *ctrlq; #ifdef TCP_OFFLOAD struct sge_ofld_rxq *ofld_rxq; +#endif +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) struct sge_wrq *ofld_txq; #endif #ifdef DEV_NETMAP @@ -1160,17 +1163,23 @@ t4_setup_vi_queues(struct vi_info *vi) if (rc != 0) goto done; } -#ifdef TCP_OFFLOAD +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) oid = SYSCTL_ADD_NODE(&vi->ctx, children, OID_AUTO, "ofld_txq", - CTLFLAG_RD, NULL, "tx queues for offloaded TCP connections"); + CTLFLAG_RD, NULL, "tx queues for TOE/ETHOFLD"); for_each_ofld_txq(vi, i, ofld_txq) { struct sysctl_oid *oid2; - iqidx = vi->first_ofld_rxq + (i % vi->nofldrxq); snprintf(name, sizeof(name), "%s ofld_txq%d", device_get_nameunit(vi->dev), i); +#ifdef TCP_OFFLOAD + iqidx = vi->first_ofld_rxq + (i % vi->nofldrxq); init_eq(sc, &ofld_txq->eq, EQ_OFLD, vi->qsize_txq, pi->tx_chan, sc->sge.ofld_rxq[iqidx].iq.cntxt_id, name); +#else + iqidx = vi->first_rxq + (i % vi->nrxq); + init_eq(sc, &ofld_txq->eq, EQ_OFLD, vi->qsize_txq, pi->tx_chan, + sc->sge.rxq[iqidx].iq.cntxt_id, name); +#endif snprintf(name, sizeof(name), "%d", i); oid2 = SYSCTL_ADD_NODE(&vi->ctx, SYSCTL_CHILDREN(oid), OID_AUTO, @@ -1215,6 +1224,8 @@ t4_teardown_vi_queues(struct vi_info *vi) struct sge_txq *txq; #ifdef TCP_OFFLOAD struct sge_ofld_rxq *ofld_rxq; +#endif +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) struct sge_wrq *ofld_txq; #endif #ifdef DEV_NETMAP @@ -1251,7 +1262,7 @@ t4_teardown_vi_queues(struct vi_info *vi) for_each_txq(vi, i, txq) { free_txq(vi, txq); } -#ifdef TCP_OFFLOAD +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) for_each_ofld_txq(vi, i, ofld_txq) { free_wrq(sc, ofld_txq); } @@ -3388,7 +3399,7 @@ eth_eq_alloc(struct adapter *sc, struct vi_info *vi, struct sge_eq *eq) return (rc); } -#ifdef TCP_OFFLOAD +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) static int ofld_eq_alloc(struct adapter *sc, struct vi_info *vi, struct sge_eq *eq) { @@ -3460,7 +3471,7 @@ alloc_eq(struct adapter *sc, struct vi_info *vi, struct sge_eq *eq) rc = eth_eq_alloc(sc, vi, eq); break; -#ifdef TCP_OFFLOAD +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) case EQ_OFLD: rc = ofld_eq_alloc(sc, vi, eq); break; @@ -3515,7 +3526,7 @@ free_eq(struct adapter *sc, struct sge_eq *eq) eq->cntxt_id); break; -#ifdef TCP_OFFLOAD +#if defined(TCP_OFFLOAD) || defined(RATELIMIT) case EQ_OFLD: rc = -t4_ofld_eq_free(sc, sc->mbox, sc->pf, 0, eq->cntxt_id); diff --git a/sys/modules/cxgbe/if_cxgbe/Makefile b/sys/modules/cxgbe/if_cxgbe/Makefile index e757ffb9bfd5..049ed3da3447 100644 --- a/sys/modules/cxgbe/if_cxgbe/Makefile +++ b/sys/modules/cxgbe/if_cxgbe/Makefile @@ -12,6 +12,7 @@ SRCS+= opt_ddb.h SRCS+= opt_inet.h SRCS+= opt_inet6.h SRCS+= opt_ofed.h +SRCS+= opt_ratelimit.h SRCS+= opt_rss.h SRCS+= pci_if.h pci_iov_if.h SRCS+= t4_filter.c |
