Date: Thu, 5 Oct 2017 07:18:17 +0000 (UTC) From: Navdeep Parhar <np@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r324296 - in head: share/man/man4 sys/dev/cxgbe Message-ID: <201710050718.v957IH0x008260@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: np Date: Thu Oct 5 07:18:16 2017 New Revision: 324296 URL: https://svnweb.freebsd.org/changeset/base/324296 Log: cxgbe(4): Provide knobs to set the holdoff parameters of TOE rx queues separately from NIC rx queues instead of using the same parameters for both types of queues. MFC after: 2 weeks Sponsored by: Chelsio Communications Modified: head/share/man/man4/cxgbe.4 head/sys/dev/cxgbe/adapter.h head/sys/dev/cxgbe/t4_main.c head/sys/dev/cxgbe/t4_sge.c Modified: head/share/man/man4/cxgbe.4 ============================================================================== --- head/share/man/man4/cxgbe.4 Thu Oct 5 07:16:31 2017 (r324295) +++ head/share/man/man4/cxgbe.4 Thu Oct 5 07:18:16 2017 (r324296) @@ -215,23 +215,27 @@ for rx and tx as well an additional pair of queues for The default is 1. .It Va hw.cxgbe.holdoff_timer_idx_10G .It Va hw.cxgbe.holdoff_timer_idx_1G +.It Va hw.cxgbe.holdoff_timer_idx_ofld Timer index value used to delay interrupts. The holdoff timer list has the values 1, 5, 10, 50, 100, and 200 by default (all values are in microseconds) and the index selects a value from this list. +holdoff_timer_idx_ofld applies to queues used for TOE rx. The default value is 1 which means the timer value is 5us. Different interfaces can be assigned different values at any time via the -dev.<port>.X.holdoff_tmr_idx sysctl. +dev.<port>.X.holdoff_tmr_idx and dev.<port>.X.holdoff_tmr_idx_ofld sysctls. .It Va hw.cxgbe.holdoff_pktc_idx_10G .It Va hw.cxgbe.holdoff_pktc_idx_1G +.It Va hw.cxgbe.holdoff_pktc_idx_ofld Packet-count index value used to delay interrupts. The packet-count list has the values 1, 8, 16, and 32 by default, and the index selects a value from this list. +holdoff_pktc_idx_ofld applies to queues used for TOE rx. The default value is -1 which means packet counting is disabled and interrupts are generated based solely on the holdoff timer value. Different interfaces can be assigned different values via the -dev.<port>.X.holdoff_pktc_idx sysctl. -This sysctl works only when the interface has never been marked up (as done by +dev.<port>.X.holdoff_pktc_idx and dev.<port>.X.holdoff_pktc_idx_ofld sysctls. +These sysctls work only when the interface has never been marked up (as done by ifconfig up). .It Va hw.cxgbe.qsize_txq Number of entries in a transmit queue's descriptor ring. Modified: head/sys/dev/cxgbe/adapter.h ============================================================================== --- head/sys/dev/cxgbe/adapter.h Thu Oct 5 07:16:31 2017 (r324295) +++ head/sys/dev/cxgbe/adapter.h Thu Oct 5 07:18:16 2017 (r324296) @@ -219,7 +219,9 @@ struct vi_info { int nnmrxq; int first_nm_rxq; int tmr_idx; + int ofld_tmr_idx; int pktc_idx; + int ofld_pktc_idx; int qsize_rxq; int qsize_txq; Modified: head/sys/dev/cxgbe/t4_main.c ============================================================================== --- head/sys/dev/cxgbe/t4_main.c Thu Oct 5 07:16:31 2017 (r324295) +++ head/sys/dev/cxgbe/t4_main.c Thu Oct 5 07:18:16 2017 (r324296) @@ -295,6 +295,14 @@ TUNABLE_INT("hw.cxgbe.nofldtxq_vi", &t4_nofldtxq_vi); static int t4_nofldrxq_vi = -NOFLDRXQ_VI; TUNABLE_INT("hw.cxgbe.nofldrxq_vi", &t4_nofldrxq_vi); +#define TMR_IDX_OFLD 1 +int t4_tmr_idx_ofld = TMR_IDX_OFLD; +TUNABLE_INT("hw.cxgbe.holdoff_timer_idx_ofld", &t4_tmr_idx_ofld); + +#define PKTC_IDX_OFLD (-1) +int t4_pktc_idx_ofld = PKTC_IDX_OFLD; +TUNABLE_INT("hw.cxgbe.holdoff_pktc_idx_ofld", &t4_pktc_idx_ofld); + /* 0 means chip/fw default, non-zero number is value in microseconds */ static u_long t4_toe_keepalive_idle = 0; TUNABLE_ULONG("hw.cxgbe.toe.keepalive_idle", &t4_toe_keepalive_idle); @@ -600,6 +608,8 @@ static int sysctl_tp_dack_timer(SYSCTL_HANDLER_ARGS); static int sysctl_tp_timer(SYSCTL_HANDLER_ARGS); static int sysctl_tp_shift_cnt(SYSCTL_HANDLER_ARGS); static int sysctl_tp_backoff(SYSCTL_HANDLER_ARGS); +static int sysctl_holdoff_tmr_idx_ofld(SYSCTL_HANDLER_ARGS); +static int sysctl_holdoff_pktc_idx_ofld(SYSCTL_HANDLER_ARGS); #endif static uint32_t fconf_iconf_to_mode(uint32_t, uint32_t); static uint32_t mode_to_fconf(uint32_t); @@ -1182,6 +1192,8 @@ t4_attach(device_t dev) vi->rsrv_noflowq = 0; #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; if (port_top_speed(pi) >= 10) { @@ -5579,6 +5591,14 @@ vi_sysctls(struct vi_info *vi) SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_ofld_txq", CTLFLAG_RD, &vi->first_ofld_txq, 0, "index of first TOE tx queue"); + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_tmr_idx_ofld", + CTLTYPE_INT | CTLFLAG_RW, vi, 0, + sysctl_holdoff_tmr_idx_ofld, "I", + "holdoff timer index for TOE queues"); + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_pktc_idx_ofld", + CTLTYPE_INT | CTLFLAG_RW, vi, 0, + sysctl_holdoff_pktc_idx_ofld, "I", + "holdoff packet counter index for TOE queues"); } #endif #ifdef DEV_NETMAP @@ -5929,9 +5949,6 @@ sysctl_holdoff_tmr_idx(SYSCTL_HANDLER_ARGS) struct adapter *sc = vi->pi->adapter; int idx, rc, i; struct sge_rxq *rxq; -#ifdef TCP_OFFLOAD - struct sge_ofld_rxq *ofld_rxq; -#endif uint8_t v; idx = vi->tmr_idx; @@ -5956,15 +5973,6 @@ sysctl_holdoff_tmr_idx(SYSCTL_HANDLER_ARGS) rxq->iq.intr_params = v; #endif } -#ifdef TCP_OFFLOAD - for_each_ofld_rxq(vi, i, ofld_rxq) { -#ifdef atomic_store_rel_8 - atomic_store_rel_8(&ofld_rxq->iq.intr_params, v); -#else - ofld_rxq->iq.intr_params = v; -#endif - } -#endif vi->tmr_idx = idx; end_synchronized_op(sc, LOCK_HELD); @@ -8380,8 +8388,75 @@ sysctl_tp_backoff(SYSCTL_HANDLER_ARGS) return (sysctl_handle_int(oidp, &v, 0, req)); } + +static int +sysctl_holdoff_tmr_idx_ofld(SYSCTL_HANDLER_ARGS) +{ + struct vi_info *vi = arg1; + struct adapter *sc = vi->pi->adapter; + int idx, rc, i; + struct sge_ofld_rxq *ofld_rxq; + uint8_t v; + + idx = vi->ofld_tmr_idx; + + rc = sysctl_handle_int(oidp, &idx, 0, req); + if (rc != 0 || req->newptr == NULL) + return (rc); + + if (idx < 0 || idx >= SGE_NTIMERS) + return (EINVAL); + + rc = begin_synchronized_op(sc, vi, HOLD_LOCK | SLEEP_OK | INTR_OK, + "t4otmr"); + if (rc) + return (rc); + + v = V_QINTR_TIMER_IDX(idx) | V_QINTR_CNT_EN(vi->ofld_pktc_idx != -1); + for_each_ofld_rxq(vi, i, ofld_rxq) { +#ifdef atomic_store_rel_8 + atomic_store_rel_8(&ofld_rxq->iq.intr_params, v); +#else + ofld_rxq->iq.intr_params = v; #endif + } + vi->ofld_tmr_idx = idx; + end_synchronized_op(sc, LOCK_HELD); + return (0); +} + +static int +sysctl_holdoff_pktc_idx_ofld(SYSCTL_HANDLER_ARGS) +{ + struct vi_info *vi = arg1; + struct adapter *sc = vi->pi->adapter; + int idx, rc; + + idx = vi->ofld_pktc_idx; + + rc = sysctl_handle_int(oidp, &idx, 0, req); + if (rc != 0 || req->newptr == NULL) + return (rc); + + if (idx < -1 || idx >= SGE_NCOUNTERS) + return (EINVAL); + + rc = begin_synchronized_op(sc, vi, HOLD_LOCK | SLEEP_OK | INTR_OK, + "t4opktc"); + if (rc) + return (rc); + + if (vi->flags & VI_INIT_DONE) + rc = EBUSY; /* cannot be changed once the queues are created */ + else + vi->ofld_pktc_idx = idx; + + end_synchronized_op(sc, LOCK_HELD); + return (rc); +} +#endif + static uint32_t fconf_iconf_to_mode(uint32_t fconf, uint32_t iconf) { @@ -9908,6 +9983,12 @@ tweak_tunables(void) FW_CAPS_CONFIG_ISCSI_TARGET_PDU | FW_CAPS_CONFIG_ISCSI_T10DIF; } + + if (t4_tmr_idx_ofld < 0 || t4_tmr_idx_ofld >= SGE_NTIMERS) + t4_tmr_idx_ofld = TMR_IDX_OFLD; + + if (t4_pktc_idx_ofld < -1 || t4_pktc_idx_ofld >= SGE_NCOUNTERS) + t4_pktc_idx_ofld = PKTC_IDX_OFLD; #else if (t4_toecaps_allowed == -1) t4_toecaps_allowed = 0; Modified: head/sys/dev/cxgbe/t4_sge.c ============================================================================== --- head/sys/dev/cxgbe/t4_sge.c Thu Oct 5 07:16:31 2017 (r324295) +++ head/sys/dev/cxgbe/t4_sge.c Thu Oct 5 07:18:16 2017 (r324296) @@ -1138,7 +1138,7 @@ t4_setup_vi_queues(struct vi_info *vi) } for_each_ofld_rxq(vi, i, ofld_rxq) { - init_iq(&ofld_rxq->iq, sc, vi->tmr_idx, vi->pktc_idx, + init_iq(&ofld_rxq->iq, sc, vi->ofld_tmr_idx, vi->ofld_pktc_idx, vi->qsize_rxq); snprintf(name, sizeof(name), "%s ofld_rxq%d-fl",
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201710050718.v957IH0x008260>