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
This commit is contained in:
parent
fed20fc736
commit
08cd1f11bd
@ -215,23 +215,27 @@ for rx and tx as well an additional pair of queues for TOE rx and tx.
|
|||||||
The default is 1.
|
The default is 1.
|
||||||
.It Va hw.cxgbe.holdoff_timer_idx_10G
|
.It Va hw.cxgbe.holdoff_timer_idx_10G
|
||||||
.It Va hw.cxgbe.holdoff_timer_idx_1G
|
.It Va hw.cxgbe.holdoff_timer_idx_1G
|
||||||
|
.It Va hw.cxgbe.holdoff_timer_idx_ofld
|
||||||
Timer index value used to delay interrupts.
|
Timer index value used to delay interrupts.
|
||||||
The holdoff timer list has the values 1, 5, 10, 50, 100, and 200
|
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
|
by default (all values are in microseconds) and the index selects a
|
||||||
value from this list.
|
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.
|
The default value is 1 which means the timer value is 5us.
|
||||||
Different interfaces can be assigned different values at any time via the
|
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_10G
|
||||||
.It Va hw.cxgbe.holdoff_pktc_idx_1G
|
.It Va hw.cxgbe.holdoff_pktc_idx_1G
|
||||||
|
.It Va hw.cxgbe.holdoff_pktc_idx_ofld
|
||||||
Packet-count index value used to delay interrupts.
|
Packet-count index value used to delay interrupts.
|
||||||
The packet-count list has the values 1, 8, 16, and 32 by default,
|
The packet-count list has the values 1, 8, 16, and 32 by default,
|
||||||
and the index selects a value from this list.
|
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
|
The default value is -1 which means packet counting is disabled and interrupts
|
||||||
are generated based solely on the holdoff timer value.
|
are generated based solely on the holdoff timer value.
|
||||||
Different interfaces can be assigned different values via the
|
Different interfaces can be assigned different values via the
|
||||||
dev.<port>.X.holdoff_pktc_idx sysctl.
|
dev.<port>.X.holdoff_pktc_idx and dev.<port>.X.holdoff_pktc_idx_ofld sysctls.
|
||||||
This sysctl works only when the interface has never been marked up (as done by
|
These sysctls work only when the interface has never been marked up (as done by
|
||||||
ifconfig up).
|
ifconfig up).
|
||||||
.It Va hw.cxgbe.qsize_txq
|
.It Va hw.cxgbe.qsize_txq
|
||||||
Number of entries in a transmit queue's descriptor ring.
|
Number of entries in a transmit queue's descriptor ring.
|
||||||
|
@ -219,7 +219,9 @@ struct vi_info {
|
|||||||
int nnmrxq;
|
int nnmrxq;
|
||||||
int first_nm_rxq;
|
int first_nm_rxq;
|
||||||
int tmr_idx;
|
int tmr_idx;
|
||||||
|
int ofld_tmr_idx;
|
||||||
int pktc_idx;
|
int pktc_idx;
|
||||||
|
int ofld_pktc_idx;
|
||||||
int qsize_rxq;
|
int qsize_rxq;
|
||||||
int qsize_txq;
|
int qsize_txq;
|
||||||
|
|
||||||
|
@ -295,6 +295,14 @@ TUNABLE_INT("hw.cxgbe.nofldtxq_vi", &t4_nofldtxq_vi);
|
|||||||
static int t4_nofldrxq_vi = -NOFLDRXQ_VI;
|
static int t4_nofldrxq_vi = -NOFLDRXQ_VI;
|
||||||
TUNABLE_INT("hw.cxgbe.nofldrxq_vi", &t4_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 */
|
/* 0 means chip/fw default, non-zero number is value in microseconds */
|
||||||
static u_long t4_toe_keepalive_idle = 0;
|
static u_long t4_toe_keepalive_idle = 0;
|
||||||
TUNABLE_ULONG("hw.cxgbe.toe.keepalive_idle", &t4_toe_keepalive_idle);
|
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_timer(SYSCTL_HANDLER_ARGS);
|
||||||
static int sysctl_tp_shift_cnt(SYSCTL_HANDLER_ARGS);
|
static int sysctl_tp_shift_cnt(SYSCTL_HANDLER_ARGS);
|
||||||
static int sysctl_tp_backoff(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
|
#endif
|
||||||
static uint32_t fconf_iconf_to_mode(uint32_t, uint32_t);
|
static uint32_t fconf_iconf_to_mode(uint32_t, uint32_t);
|
||||||
static uint32_t mode_to_fconf(uint32_t);
|
static uint32_t mode_to_fconf(uint32_t);
|
||||||
@ -1182,6 +1192,8 @@ t4_attach(device_t dev)
|
|||||||
vi->rsrv_noflowq = 0;
|
vi->rsrv_noflowq = 0;
|
||||||
|
|
||||||
#ifdef TCP_OFFLOAD
|
#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_rxq = ofld_rqidx;
|
||||||
vi->first_ofld_txq = ofld_tqidx;
|
vi->first_ofld_txq = ofld_tqidx;
|
||||||
if (port_top_speed(pi) >= 10) {
|
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",
|
SYSCTL_ADD_INT(ctx, children, OID_AUTO, "first_ofld_txq",
|
||||||
CTLFLAG_RD, &vi->first_ofld_txq, 0,
|
CTLFLAG_RD, &vi->first_ofld_txq, 0,
|
||||||
"index of first TOE tx queue");
|
"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
|
#endif
|
||||||
#ifdef DEV_NETMAP
|
#ifdef DEV_NETMAP
|
||||||
@ -5929,9 +5949,6 @@ sysctl_holdoff_tmr_idx(SYSCTL_HANDLER_ARGS)
|
|||||||
struct adapter *sc = vi->pi->adapter;
|
struct adapter *sc = vi->pi->adapter;
|
||||||
int idx, rc, i;
|
int idx, rc, i;
|
||||||
struct sge_rxq *rxq;
|
struct sge_rxq *rxq;
|
||||||
#ifdef TCP_OFFLOAD
|
|
||||||
struct sge_ofld_rxq *ofld_rxq;
|
|
||||||
#endif
|
|
||||||
uint8_t v;
|
uint8_t v;
|
||||||
|
|
||||||
idx = vi->tmr_idx;
|
idx = vi->tmr_idx;
|
||||||
@ -5956,15 +5973,6 @@ sysctl_holdoff_tmr_idx(SYSCTL_HANDLER_ARGS)
|
|||||||
rxq->iq.intr_params = v;
|
rxq->iq.intr_params = v;
|
||||||
#endif
|
#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;
|
vi->tmr_idx = idx;
|
||||||
|
|
||||||
end_synchronized_op(sc, LOCK_HELD);
|
end_synchronized_op(sc, LOCK_HELD);
|
||||||
@ -8380,6 +8388,73 @@ sysctl_tp_backoff(SYSCTL_HANDLER_ARGS)
|
|||||||
|
|
||||||
return (sysctl_handle_int(oidp, &v, 0, req));
|
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
|
#endif
|
||||||
|
|
||||||
static uint32_t
|
static uint32_t
|
||||||
@ -9908,6 +9983,12 @@ tweak_tunables(void)
|
|||||||
FW_CAPS_CONFIG_ISCSI_TARGET_PDU |
|
FW_CAPS_CONFIG_ISCSI_TARGET_PDU |
|
||||||
FW_CAPS_CONFIG_ISCSI_T10DIF;
|
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
|
#else
|
||||||
if (t4_toecaps_allowed == -1)
|
if (t4_toecaps_allowed == -1)
|
||||||
t4_toecaps_allowed = 0;
|
t4_toecaps_allowed = 0;
|
||||||
|
@ -1138,7 +1138,7 @@ t4_setup_vi_queues(struct vi_info *vi)
|
|||||||
}
|
}
|
||||||
for_each_ofld_rxq(vi, i, ofld_rxq) {
|
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);
|
vi->qsize_rxq);
|
||||||
|
|
||||||
snprintf(name, sizeof(name), "%s ofld_rxq%d-fl",
|
snprintf(name, sizeof(name), "%s ofld_rxq%d-fl",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user