cxgbe(4): two new debug sysctls.
dev.<nexus>.<instance>.misc.tid_stats dev.<nexus>.<instance>.misc.tnl_stats MFC after: 3 days Sponsored by: Chelsio Communications
This commit is contained in:
parent
bdb00630f2
commit
cc1b95ee91
@ -189,6 +189,13 @@ struct tp_usm_stats {
|
||||
u64 octets;
|
||||
};
|
||||
|
||||
struct tp_tid_stats {
|
||||
u32 del;
|
||||
u32 inv;
|
||||
u32 act;
|
||||
u32 pas;
|
||||
};
|
||||
|
||||
struct tp_fcoe_stats {
|
||||
u32 frames_ddp;
|
||||
u32 frames_drop;
|
||||
@ -208,6 +215,11 @@ struct tp_err_stats {
|
||||
u32 ofld_cong_defer;
|
||||
};
|
||||
|
||||
struct tp_tnl_stats {
|
||||
u32 out_pkt[MAX_NCHAN];
|
||||
u32 in_pkt[MAX_NCHAN];
|
||||
};
|
||||
|
||||
struct tp_proxy_stats {
|
||||
u32 proxy[MAX_NCHAN];
|
||||
};
|
||||
@ -715,6 +727,8 @@ void t4_tp_wr_bits_indirect(struct adapter *adap, unsigned int addr,
|
||||
void t4_tp_read_la(struct adapter *adap, u64 *la_buf, unsigned int *wrptr);
|
||||
void t4_tp_get_err_stats(struct adapter *adap, struct tp_err_stats *st,
|
||||
bool sleep_ok);
|
||||
void t4_tp_get_tnl_stats(struct adapter *adap, struct tp_tnl_stats *st,
|
||||
bool sleep_ok);
|
||||
void t4_tp_get_proxy_stats(struct adapter *adap, struct tp_proxy_stats *st,
|
||||
bool sleep_ok);
|
||||
void t4_tp_get_cpl_stats(struct adapter *adap, struct tp_cpl_stats *st,
|
||||
@ -723,6 +737,8 @@ void t4_tp_get_rdma_stats(struct adapter *adap, struct tp_rdma_stats *st,
|
||||
bool sleep_ok);
|
||||
void t4_get_usm_stats(struct adapter *adap, struct tp_usm_stats *st,
|
||||
bool sleep_ok);
|
||||
void t4_tp_get_tid_stats(struct adapter *adap, struct tp_tid_stats *st,
|
||||
bool sleep_ok);
|
||||
void t4_tp_get_tcp_stats(struct adapter *adap, struct tp_tcp_stats *v4,
|
||||
struct tp_tcp_stats *v6, bool sleep_ok);
|
||||
void t4_get_fcoe_stats(struct adapter *adap, unsigned int idx,
|
||||
|
@ -6168,6 +6168,25 @@ void t4_tp_get_err_stats(struct adapter *adap, struct tp_err_stats *st,
|
||||
sleep_ok);
|
||||
}
|
||||
|
||||
/**
|
||||
* t4_tp_get_err_stats - read TP's error MIB counters
|
||||
* @adap: the adapter
|
||||
* @st: holds the counter values
|
||||
* @sleep_ok: if true we may sleep while awaiting command completion
|
||||
*
|
||||
* Returns the values of TP's error counters.
|
||||
*/
|
||||
void t4_tp_get_tnl_stats(struct adapter *adap, struct tp_tnl_stats *st,
|
||||
bool sleep_ok)
|
||||
{
|
||||
int nchan = adap->chip_params->nchan;
|
||||
|
||||
t4_tp_mib_read(adap, st->out_pkt, nchan, A_TP_MIB_TNL_OUT_PKT_0,
|
||||
sleep_ok);
|
||||
t4_tp_mib_read(adap, st->in_pkt, nchan, A_TP_MIB_TNL_IN_PKT_0,
|
||||
sleep_ok);
|
||||
}
|
||||
|
||||
/**
|
||||
* t4_tp_get_proxy_stats - read TP's proxy MIB counters
|
||||
* @adap: the adapter
|
||||
@ -6261,6 +6280,21 @@ void t4_get_usm_stats(struct adapter *adap, struct tp_usm_stats *st,
|
||||
st->octets = ((u64)val[2] << 32) | val[3];
|
||||
}
|
||||
|
||||
/**
|
||||
* t4_tp_get_tid_stats - read TP's tid MIB counters.
|
||||
* @adap: the adapter
|
||||
* @st: holds the counter values
|
||||
* @sleep_ok: if true we may sleep while awaiting command completion
|
||||
*
|
||||
* Returns the values of TP's counters for tids.
|
||||
*/
|
||||
void t4_tp_get_tid_stats(struct adapter *adap, struct tp_tid_stats *st,
|
||||
bool sleep_ok)
|
||||
{
|
||||
|
||||
t4_tp_mib_read(adap, &st->del, 4, A_TP_MIB_TID_DEL, sleep_ok);
|
||||
}
|
||||
|
||||
/**
|
||||
* t4_read_mtu_tbl - returns the values in the HW path MTU table
|
||||
* @adap: the adapter
|
||||
|
@ -761,6 +761,7 @@ static int sysctl_cim_pif_la(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_cim_qcfg(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_cpl_stats(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_ddp_stats(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_tid_stats(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_devlog(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_fcoe_stats(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_hw_sched(SYSCTL_HANDLER_ARGS);
|
||||
@ -775,6 +776,7 @@ static int sysctl_rdma_stats(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_tcp_stats(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_tids(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_tp_err_stats(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_tnl_stats(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_tp_la_mask(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_tp_la(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_tx_rate(SYSCTL_HANDLER_ARGS);
|
||||
@ -6633,6 +6635,10 @@ t4_sysctls(struct adapter *sc)
|
||||
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
|
||||
sysctl_ddp_stats, "A", "non-TCP DDP statistics");
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tid_stats",
|
||||
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
|
||||
sysctl_tid_stats, "A", "tid stats");
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "devlog",
|
||||
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
|
||||
sysctl_devlog, "A", "firmware's device log");
|
||||
@ -6696,6 +6702,10 @@ t4_sysctls(struct adapter *sc)
|
||||
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
|
||||
sysctl_tp_err_stats, "A", "TP error statistics");
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tnl_stats",
|
||||
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
|
||||
sysctl_tnl_stats, "A", "TP tunnel statistics");
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tp_la_mask",
|
||||
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
|
||||
sysctl_tp_la_mask, "I", "TP logic analyzer event capture mask");
|
||||
@ -8291,7 +8301,9 @@ sysctl_ddp_stats(SYSCTL_HANDLER_ARGS)
|
||||
if (sb == NULL)
|
||||
return (ENOMEM);
|
||||
|
||||
mtx_lock(&sc->reg_lock);
|
||||
t4_get_usm_stats(sc, &stats, 1);
|
||||
mtx_unlock(&sc->reg_lock);
|
||||
|
||||
sbuf_printf(sb, "Frames: %u\n", stats.frames);
|
||||
sbuf_printf(sb, "Octets: %ju\n", stats.octets);
|
||||
@ -8303,6 +8315,37 @@ sysctl_ddp_stats(SYSCTL_HANDLER_ARGS)
|
||||
return (rc);
|
||||
}
|
||||
|
||||
static int
|
||||
sysctl_tid_stats(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
struct adapter *sc = arg1;
|
||||
struct sbuf *sb;
|
||||
int rc;
|
||||
struct tp_tid_stats stats;
|
||||
|
||||
rc = sysctl_wire_old_buffer(req, 0);
|
||||
if (rc != 0)
|
||||
return(rc);
|
||||
|
||||
sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
|
||||
if (sb == NULL)
|
||||
return (ENOMEM);
|
||||
|
||||
mtx_lock(&sc->reg_lock);
|
||||
t4_tp_get_tid_stats(sc, &stats, 1);
|
||||
mtx_unlock(&sc->reg_lock);
|
||||
|
||||
sbuf_printf(sb, "Delete: %u\n", stats.del);
|
||||
sbuf_printf(sb, "Invalidate: %u\n", stats.inv);
|
||||
sbuf_printf(sb, "Active: %u\n", stats.act);
|
||||
sbuf_printf(sb, "Passive: %u", stats.pas);
|
||||
|
||||
rc = sbuf_finish(sb);
|
||||
sbuf_delete(sb);
|
||||
|
||||
return (rc);
|
||||
}
|
||||
|
||||
static const char * const devlog_level_strings[] = {
|
||||
[FW_DEVLOG_LEVEL_EMERG] = "EMERG",
|
||||
[FW_DEVLOG_LEVEL_CRIT] = "CRIT",
|
||||
@ -8465,8 +8508,10 @@ sysctl_fcoe_stats(SYSCTL_HANDLER_ARGS)
|
||||
if (sb == NULL)
|
||||
return (ENOMEM);
|
||||
|
||||
mtx_lock(&sc->reg_lock);
|
||||
for (i = 0; i < nchan; i++)
|
||||
t4_get_fcoe_stats(sc, i, &stats[i], 1);
|
||||
mtx_unlock(&sc->reg_lock);
|
||||
|
||||
if (nchan > 2) {
|
||||
sbuf_printf(sb, " channel 0 channel 1"
|
||||
@ -9462,6 +9507,49 @@ sysctl_tp_err_stats(SYSCTL_HANDLER_ARGS)
|
||||
return (rc);
|
||||
}
|
||||
|
||||
static int
|
||||
sysctl_tnl_stats(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
struct adapter *sc = arg1;
|
||||
struct sbuf *sb;
|
||||
int rc;
|
||||
struct tp_tnl_stats stats;
|
||||
|
||||
rc = sysctl_wire_old_buffer(req, 0);
|
||||
if (rc != 0)
|
||||
return(rc);
|
||||
|
||||
sb = sbuf_new_for_sysctl(NULL, NULL, 256, req);
|
||||
if (sb == NULL)
|
||||
return (ENOMEM);
|
||||
|
||||
mtx_lock(&sc->reg_lock);
|
||||
t4_tp_get_tnl_stats(sc, &stats, 1);
|
||||
mtx_unlock(&sc->reg_lock);
|
||||
|
||||
if (sc->chip_params->nchan > 2) {
|
||||
sbuf_printf(sb, " channel 0 channel 1"
|
||||
" channel 2 channel 3\n");
|
||||
sbuf_printf(sb, "OutPkts: %10u %10u %10u %10u\n",
|
||||
stats.out_pkt[0], stats.out_pkt[1],
|
||||
stats.out_pkt[2], stats.out_pkt[3]);
|
||||
sbuf_printf(sb, "InPkts: %10u %10u %10u %10u",
|
||||
stats.in_pkt[0], stats.in_pkt[1],
|
||||
stats.in_pkt[2], stats.in_pkt[3]);
|
||||
} else {
|
||||
sbuf_printf(sb, " channel 0 channel 1\n");
|
||||
sbuf_printf(sb, "OutPkts: %10u %10u\n",
|
||||
stats.out_pkt[0], stats.out_pkt[1]);
|
||||
sbuf_printf(sb, "InPkts: %10u %10u",
|
||||
stats.in_pkt[0], stats.in_pkt[1]);
|
||||
}
|
||||
|
||||
rc = sbuf_finish(sb);
|
||||
sbuf_delete(sb);
|
||||
|
||||
return (rc);
|
||||
}
|
||||
|
||||
static int
|
||||
sysctl_tp_la_mask(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user