Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/cxgb/cxgb_sge.c
Show All 12 Lines | |||||
struct sysctl_oid_list *children; | struct sysctl_oid_list *children; | ||||
int i, j; | int i, j; | ||||
ctx = device_get_sysctl_ctx(sc->dev); | ctx = device_get_sysctl_ctx(sc->dev); | ||||
children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)); | children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)); | ||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, | SYSCTL_ADD_PROC(ctx, children, OID_AUTO, | ||||
"intr_coal", | "intr_coal", | ||||
CTLTYPE_INT|CTLFLAG_RW, sc, | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, | ||||
0, t3_set_coalesce_usecs, | sc, 0, t3_set_coalesce_usecs, "I", | ||||
"I", "interrupt coalescing timer (us)"); | "interrupt coalescing timer (us)"); | ||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, | SYSCTL_ADD_PROC(ctx, children, OID_AUTO, | ||||
"pkt_timestamp", | "pkt_timestamp", | ||||
CTLTYPE_INT | CTLFLAG_RW, sc, | CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, | ||||
0, t3_pkt_timestamp, | sc, 0, t3_pkt_timestamp, "I", | ||||
"I", "provide packet timestamp instead of connection hash"); | "provide packet timestamp instead of connection hash"); | ||||
for (i = 0; i < sc->params.nports; i++) { | for (i = 0; i < sc->params.nports; i++) { | ||||
struct port_info *pi = &sc->port[i]; | struct port_info *pi = &sc->port[i]; | ||||
struct sysctl_oid *poid; | struct sysctl_oid *poid; | ||||
struct sysctl_oid_list *poidlist; | struct sysctl_oid_list *poidlist; | ||||
struct mac_stats *mstats = &pi->mac.stats; | struct mac_stats *mstats = &pi->mac.stats; | ||||
snprintf(pi->namebuf, PORT_NAME_LEN, "port%d", i); | snprintf(pi->namebuf, PORT_NAME_LEN, "port%d", i); | ||||
poid = SYSCTL_ADD_NODE(ctx, children, OID_AUTO, | poid = SYSCTL_ADD_NODE(ctx, children, OID_AUTO, | ||||
pi->namebuf, CTLFLAG_RD, NULL, "port statistics"); | pi->namebuf, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, | ||||
"port statistics"); | |||||
poidlist = SYSCTL_CHILDREN(poid); | poidlist = SYSCTL_CHILDREN(poid); | ||||
SYSCTL_ADD_UINT(ctx, poidlist, OID_AUTO, | SYSCTL_ADD_UINT(ctx, poidlist, OID_AUTO, | ||||
"nqsets", CTLFLAG_RD, &pi->nqsets, | "nqsets", CTLFLAG_RD, &pi->nqsets, | ||||
0, "#queue sets"); | 0, "#queue sets"); | ||||
for (j = 0; j < pi->nqsets; j++) { | for (j = 0; j < pi->nqsets; j++) { | ||||
struct sge_qset *qs = &sc->sge.qs[pi->first_qset + j]; | struct sge_qset *qs = &sc->sge.qs[pi->first_qset + j]; | ||||
struct sysctl_oid *qspoid, *rspqpoid, *txqpoid, | struct sysctl_oid *qspoid, *rspqpoid, *txqpoid, | ||||
*ctrlqpoid, *lropoid; | *ctrlqpoid, *lropoid; | ||||
struct sysctl_oid_list *qspoidlist, *rspqpoidlist, | struct sysctl_oid_list *qspoidlist, *rspqpoidlist, | ||||
*txqpoidlist, *ctrlqpoidlist, | *txqpoidlist, *ctrlqpoidlist, | ||||
*lropoidlist; | *lropoidlist; | ||||
struct sge_txq *txq = &qs->txq[TXQ_ETH]; | struct sge_txq *txq = &qs->txq[TXQ_ETH]; | ||||
snprintf(qs->namebuf, QS_NAME_LEN, "qs%d", j); | snprintf(qs->namebuf, QS_NAME_LEN, "qs%d", j); | ||||
qspoid = SYSCTL_ADD_NODE(ctx, poidlist, OID_AUTO, | qspoid = SYSCTL_ADD_NODE(ctx, poidlist, OID_AUTO, | ||||
qs->namebuf, CTLFLAG_RD, NULL, "qset statistics"); | qs->namebuf, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, | ||||
"qset statistics"); | |||||
qspoidlist = SYSCTL_CHILDREN(qspoid); | qspoidlist = SYSCTL_CHILDREN(qspoid); | ||||
SYSCTL_ADD_UINT(ctx, qspoidlist, OID_AUTO, "fl0_empty", | SYSCTL_ADD_UINT(ctx, qspoidlist, OID_AUTO, "fl0_empty", | ||||
CTLFLAG_RD, &qs->fl[0].empty, 0, | CTLFLAG_RD, &qs->fl[0].empty, 0, | ||||
"freelist #0 empty"); | "freelist #0 empty"); | ||||
SYSCTL_ADD_UINT(ctx, qspoidlist, OID_AUTO, "fl1_empty", | SYSCTL_ADD_UINT(ctx, qspoidlist, OID_AUTO, "fl1_empty", | ||||
CTLFLAG_RD, &qs->fl[1].empty, 0, | CTLFLAG_RD, &qs->fl[1].empty, 0, | ||||
"freelist #1 empty"); | "freelist #1 empty"); | ||||
rspqpoid = SYSCTL_ADD_NODE(ctx, qspoidlist, OID_AUTO, | rspqpoid = SYSCTL_ADD_NODE(ctx, qspoidlist, OID_AUTO, | ||||
rspq_name, CTLFLAG_RD, NULL, "rspq statistics"); | rspq_name, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, | ||||
"rspq statistics"); | |||||
rspqpoidlist = SYSCTL_CHILDREN(rspqpoid); | rspqpoidlist = SYSCTL_CHILDREN(rspqpoid); | ||||
txqpoid = SYSCTL_ADD_NODE(ctx, qspoidlist, OID_AUTO, | txqpoid = SYSCTL_ADD_NODE(ctx, qspoidlist, OID_AUTO, | ||||
txq_names[0], CTLFLAG_RD, NULL, "txq statistics"); | txq_names[0], CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, | ||||
"txq statistics"); | |||||
txqpoidlist = SYSCTL_CHILDREN(txqpoid); | txqpoidlist = SYSCTL_CHILDREN(txqpoid); | ||||
ctrlqpoid = SYSCTL_ADD_NODE(ctx, qspoidlist, OID_AUTO, | ctrlqpoid = SYSCTL_ADD_NODE(ctx, qspoidlist, OID_AUTO, | ||||
txq_names[2], CTLFLAG_RD, NULL, "ctrlq statistics"); | txq_names[2], CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, | ||||
"ctrlq statistics"); | |||||
ctrlqpoidlist = SYSCTL_CHILDREN(ctrlqpoid); | ctrlqpoidlist = SYSCTL_CHILDREN(ctrlqpoid); | ||||
lropoid = SYSCTL_ADD_NODE(ctx, qspoidlist, OID_AUTO, | lropoid = SYSCTL_ADD_NODE(ctx, qspoidlist, OID_AUTO, | ||||
"lro_stats", CTLFLAG_RD, NULL, "LRO statistics"); | "lro_stats", CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, | ||||
"LRO statistics"); | |||||
lropoidlist = SYSCTL_CHILDREN(lropoid); | lropoidlist = SYSCTL_CHILDREN(lropoid); | ||||
SYSCTL_ADD_UINT(ctx, rspqpoidlist, OID_AUTO, "size", | SYSCTL_ADD_UINT(ctx, rspqpoidlist, OID_AUTO, "size", | ||||
CTLFLAG_RD, &qs->rspq.size, | CTLFLAG_RD, &qs->rspq.size, | ||||
0, "#entries in response queue"); | 0, "#entries in response queue"); | ||||
SYSCTL_ADD_UINT(ctx, rspqpoidlist, OID_AUTO, "cidx", | SYSCTL_ADD_UINT(ctx, rspqpoidlist, OID_AUTO, "cidx", | ||||
CTLFLAG_RD, &qs->rspq.cidx, | CTLFLAG_RD, &qs->rspq.cidx, | ||||
0, "consumer index"); | 0, "consumer index"); | ||||
SYSCTL_ADD_UINT(ctx, rspqpoidlist, OID_AUTO, "credits", | SYSCTL_ADD_UINT(ctx, rspqpoidlist, OID_AUTO, "credits", | ||||
CTLFLAG_RD, &qs->rspq.credits, | CTLFLAG_RD, &qs->rspq.credits, | ||||
0, "#credits"); | 0, "#credits"); | ||||
SYSCTL_ADD_UINT(ctx, rspqpoidlist, OID_AUTO, "starved", | SYSCTL_ADD_UINT(ctx, rspqpoidlist, OID_AUTO, "starved", | ||||
CTLFLAG_RD, &qs->rspq.starved, | CTLFLAG_RD, &qs->rspq.starved, | ||||
0, "#times starved"); | 0, "#times starved"); | ||||
SYSCTL_ADD_UAUTO(ctx, rspqpoidlist, OID_AUTO, "phys_addr", | SYSCTL_ADD_UAUTO(ctx, rspqpoidlist, OID_AUTO, "phys_addr", | ||||
CTLFLAG_RD, &qs->rspq.phys_addr, | CTLFLAG_RD, &qs->rspq.phys_addr, | ||||
"physical_address_of the queue"); | "physical_address_of the queue"); | ||||
SYSCTL_ADD_UINT(ctx, rspqpoidlist, OID_AUTO, "dump_start", | SYSCTL_ADD_UINT(ctx, rspqpoidlist, OID_AUTO, "dump_start", | ||||
CTLFLAG_RW, &qs->rspq.rspq_dump_start, | CTLFLAG_RW, &qs->rspq.rspq_dump_start, | ||||
0, "start rspq dump entry"); | 0, "start rspq dump entry"); | ||||
SYSCTL_ADD_UINT(ctx, rspqpoidlist, OID_AUTO, "dump_count", | SYSCTL_ADD_UINT(ctx, rspqpoidlist, OID_AUTO, "dump_count", | ||||
CTLFLAG_RW, &qs->rspq.rspq_dump_count, | CTLFLAG_RW, &qs->rspq.rspq_dump_count, | ||||
0, "#rspq entries to dump"); | 0, "#rspq entries to dump"); | ||||
SYSCTL_ADD_PROC(ctx, rspqpoidlist, OID_AUTO, "qdump", | SYSCTL_ADD_PROC(ctx, rspqpoidlist, OID_AUTO, "qdump", | ||||
CTLTYPE_STRING | CTLFLAG_RD, &qs->rspq, | CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | ||||
0, t3_dump_rspq, "A", "dump of the response queue"); | &qs->rspq, 0, t3_dump_rspq, "A", | ||||
"dump of the response queue"); | |||||
SYSCTL_ADD_UQUAD(ctx, txqpoidlist, OID_AUTO, "dropped", | SYSCTL_ADD_UQUAD(ctx, txqpoidlist, OID_AUTO, "dropped", | ||||
CTLFLAG_RD, &qs->txq[TXQ_ETH].txq_mr->br_drops, | CTLFLAG_RD, &qs->txq[TXQ_ETH].txq_mr->br_drops, | ||||
"#tunneled packets dropped"); | "#tunneled packets dropped"); | ||||
SYSCTL_ADD_UINT(ctx, txqpoidlist, OID_AUTO, "sendqlen", | SYSCTL_ADD_UINT(ctx, txqpoidlist, OID_AUTO, "sendqlen", | ||||
CTLFLAG_RD, &qs->txq[TXQ_ETH].sendq.mq_len, | CTLFLAG_RD, &qs->txq[TXQ_ETH].sendq.mq_len, | ||||
0, "#tunneled packets waiting to be sent"); | 0, "#tunneled packets waiting to be sent"); | ||||
#if 0 | #if 0 | ||||
Show All 24 Lines | |||||
0, "hardware queue pidx"); | 0, "hardware queue pidx"); | ||||
SYSCTL_ADD_UINT(ctx, txqpoidlist, OID_AUTO, "dump_start", | SYSCTL_ADD_UINT(ctx, txqpoidlist, OID_AUTO, "dump_start", | ||||
CTLFLAG_RW, &qs->txq[TXQ_ETH].txq_dump_start, | CTLFLAG_RW, &qs->txq[TXQ_ETH].txq_dump_start, | ||||
0, "txq start idx for dump"); | 0, "txq start idx for dump"); | ||||
SYSCTL_ADD_UINT(ctx, txqpoidlist, OID_AUTO, "dump_count", | SYSCTL_ADD_UINT(ctx, txqpoidlist, OID_AUTO, "dump_count", | ||||
CTLFLAG_RW, &qs->txq[TXQ_ETH].txq_dump_count, | CTLFLAG_RW, &qs->txq[TXQ_ETH].txq_dump_count, | ||||
0, "txq #entries to dump"); | 0, "txq #entries to dump"); | ||||
SYSCTL_ADD_PROC(ctx, txqpoidlist, OID_AUTO, "qdump", | SYSCTL_ADD_PROC(ctx, txqpoidlist, OID_AUTO, "qdump", | ||||
CTLTYPE_STRING | CTLFLAG_RD, &qs->txq[TXQ_ETH], | CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | ||||
0, t3_dump_txq_eth, "A", "dump of the transmit queue"); | &qs->txq[TXQ_ETH], 0, t3_dump_txq_eth, "A", | ||||
"dump of the transmit queue"); | |||||
SYSCTL_ADD_UINT(ctx, ctrlqpoidlist, OID_AUTO, "dump_start", | SYSCTL_ADD_UINT(ctx, ctrlqpoidlist, OID_AUTO, "dump_start", | ||||
CTLFLAG_RW, &qs->txq[TXQ_CTRL].txq_dump_start, | CTLFLAG_RW, &qs->txq[TXQ_CTRL].txq_dump_start, | ||||
0, "ctrlq start idx for dump"); | 0, "ctrlq start idx for dump"); | ||||
SYSCTL_ADD_UINT(ctx, ctrlqpoidlist, OID_AUTO, "dump_count", | SYSCTL_ADD_UINT(ctx, ctrlqpoidlist, OID_AUTO, "dump_count", | ||||
CTLFLAG_RW, &qs->txq[TXQ_CTRL].txq_dump_count, | CTLFLAG_RW, &qs->txq[TXQ_CTRL].txq_dump_count, | ||||
0, "ctrl #entries to dump"); | 0, "ctrl #entries to dump"); | ||||
SYSCTL_ADD_PROC(ctx, ctrlqpoidlist, OID_AUTO, "qdump", | SYSCTL_ADD_PROC(ctx, ctrlqpoidlist, OID_AUTO, "qdump", | ||||
CTLTYPE_STRING | CTLFLAG_RD, &qs->txq[TXQ_CTRL], | CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | ||||
0, t3_dump_txq_ctrl, "A", "dump of the transmit queue"); | &qs->txq[TXQ_CTRL], 0, t3_dump_txq_ctrl, "A", | ||||
"dump of the transmit queue"); | |||||
SYSCTL_ADD_U64(ctx, lropoidlist, OID_AUTO, "lro_queued", | SYSCTL_ADD_U64(ctx, lropoidlist, OID_AUTO, "lro_queued", | ||||
CTLFLAG_RD, &qs->lro.ctrl.lro_queued, 0, NULL); | CTLFLAG_RD, &qs->lro.ctrl.lro_queued, 0, NULL); | ||||
SYSCTL_ADD_U64(ctx, lropoidlist, OID_AUTO, "lro_flushed", | SYSCTL_ADD_U64(ctx, lropoidlist, OID_AUTO, "lro_flushed", | ||||
CTLFLAG_RD, &qs->lro.ctrl.lro_flushed, 0, NULL); | CTLFLAG_RD, &qs->lro.ctrl.lro_flushed, 0, NULL); | ||||
SYSCTL_ADD_U64(ctx, lropoidlist, OID_AUTO, "lro_bad_csum", | SYSCTL_ADD_U64(ctx, lropoidlist, OID_AUTO, "lro_bad_csum", | ||||
CTLFLAG_RD, &qs->lro.ctrl.lro_bad_csum, 0, NULL); | CTLFLAG_RD, &qs->lro.ctrl.lro_bad_csum, 0, NULL); | ||||
SYSCTL_ADD_INT(ctx, lropoidlist, OID_AUTO, "lro_cnt", | SYSCTL_ADD_INT(ctx, lropoidlist, OID_AUTO, "lro_cnt", | ||||
CTLFLAG_RD, &qs->lro.ctrl.lro_cnt, 0, NULL); | CTLFLAG_RD, &qs->lro.ctrl.lro_cnt, 0, NULL); | ||||
} | } | ||||
/* Now add a node for mac stats. */ | /* Now add a node for mac stats. */ | ||||
poid = SYSCTL_ADD_NODE(ctx, poidlist, OID_AUTO, "mac_stats", | poid = SYSCTL_ADD_NODE(ctx, poidlist, OID_AUTO, "mac_stats", | ||||
CTLFLAG_RD, NULL, "MAC statistics"); | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, | ||||
"MAC statistics"); | |||||
poidlist = SYSCTL_CHILDREN(poid); | poidlist = SYSCTL_CHILDREN(poid); | ||||
/* | /* | ||||
* We (ab)use the length argument (arg2) to pass on the offset | * We (ab)use the length argument (arg2) to pass on the offset | ||||
* of the data that we are interested in. This is only required | * of the data that we are interested in. This is only required | ||||
* for the quad counters that are updated from the hardware (we | * for the quad counters that are updated from the hardware (we | ||||
* make sure that we return the latest value). | * make sure that we return the latest value). | ||||
* sysctl_handle_macstat first updates *all* the counters from | * sysctl_handle_macstat first updates *all* the counters from | ||||
* the hardware, and then returns the latest value of the | * the hardware, and then returns the latest value of the | ||||
* requested counter. Best would be to update only the | * requested counter. Best would be to update only the | ||||
* requested counter from hardware, but t3_mac_update_stats() | * requested counter from hardware, but t3_mac_update_stats() | ||||
* hides all the register details and we don't want to dive into | * hides all the register details and we don't want to dive into | ||||
* all that here. | * all that here. | ||||
*/ | */ | ||||
#define CXGB_SYSCTL_ADD_QUAD(a) SYSCTL_ADD_OID(ctx, poidlist, OID_AUTO, #a, \ | #define CXGB_SYSCTL_ADD_QUAD(a) SYSCTL_ADD_OID(ctx, poidlist, OID_AUTO, #a, \ | ||||
(CTLTYPE_U64 | CTLFLAG_RD), pi, offsetof(struct mac_stats, a), \ | (CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_MPSAFE), \ | ||||
sysctl_handle_macstat, "QU", 0) | pi, offsetof(struct mac_stats, a), sysctl_handle_macstat, "QU", \ | ||||
0) | |||||
CXGB_SYSCTL_ADD_QUAD(tx_octets); | CXGB_SYSCTL_ADD_QUAD(tx_octets); | ||||
CXGB_SYSCTL_ADD_QUAD(tx_octets_bad); | CXGB_SYSCTL_ADD_QUAD(tx_octets_bad); | ||||
CXGB_SYSCTL_ADD_QUAD(tx_frames); | CXGB_SYSCTL_ADD_QUAD(tx_frames); | ||||
CXGB_SYSCTL_ADD_QUAD(tx_mcast_frames); | CXGB_SYSCTL_ADD_QUAD(tx_mcast_frames); | ||||
CXGB_SYSCTL_ADD_QUAD(tx_bcast_frames); | CXGB_SYSCTL_ADD_QUAD(tx_bcast_frames); | ||||
CXGB_SYSCTL_ADD_QUAD(tx_pause); | CXGB_SYSCTL_ADD_QUAD(tx_pause); | ||||
CXGB_SYSCTL_ADD_QUAD(tx_deferred); | CXGB_SYSCTL_ADD_QUAD(tx_deferred); | ||||
CXGB_SYSCTL_ADD_QUAD(tx_late_collisions); | CXGB_SYSCTL_ADD_QUAD(tx_late_collisions); | ||||
Show All 12 Lines |