summaryrefslogtreecommitdiff
path: root/usr/src/cmd/mdb/common/modules/mac/mac.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/mdb/common/modules/mac/mac.c')
-rw-r--r--usr/src/cmd/mdb/common/modules/mac/mac.c230
1 files changed, 192 insertions, 38 deletions
diff --git a/usr/src/cmd/mdb/common/modules/mac/mac.c b/usr/src/cmd/mdb/common/modules/mac/mac.c
index 4a56960ca7..268d92ac2d 100644
--- a/usr/src/cmd/mdb/common/modules/mac/mac.c
+++ b/usr/src/cmd/mdb/common/modules/mac/mac.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -34,6 +34,7 @@
#include <sys/mac_client_impl.h>
#include <sys/mac_flow_impl.h>
#include <sys/mac_soft_ring.h>
+#include <sys/mac_stat.h>
#define STRSIZE 64
#define MAC_RX_SRS_SIZE (MAX_RINGS_PER_GROUP * sizeof (uintptr_t))
@@ -59,12 +60,15 @@
#define MAC_SRS_STAT 0x04
#define MAC_SRS_CPU 0x08
#define MAC_SRS_VERBOSE 0x10
+#define MAC_SRS_INTR 0x20
#define MAC_SRS_RXSTAT (MAC_SRS_RX|MAC_SRS_STAT)
#define MAC_SRS_TXSTAT (MAC_SRS_TX|MAC_SRS_STAT)
#define MAC_SRS_RXCPU (MAC_SRS_RX|MAC_SRS_CPU)
#define MAC_SRS_TXCPU (MAC_SRS_TX|MAC_SRS_CPU)
#define MAC_SRS_RXCPUVERBOSE (MAC_SRS_RXCPU|MAC_SRS_VERBOSE)
#define MAC_SRS_TXCPUVERBOSE (MAC_SRS_TXCPU|MAC_SRS_VERBOSE)
+#define MAC_SRS_RXINTR (MAC_SRS_RX|MAC_SRS_INTR)
+#define MAC_SRS_TXINTR (MAC_SRS_TX|MAC_SRS_INTR)
static char *
mac_flow_proto2str(uint8_t protocol)
@@ -314,9 +318,28 @@ mac_flow_dcmd_output(uintptr_t addr, uint_t flags, uint_t args)
break;
}
case MAC_FLOW_STATS: {
+ uint64_t totibytes = 0;
+ uint64_t totobytes = 0;
+ mac_soft_ring_set_t *mac_srs;
+ mac_rx_stats_t *mac_rx_stat;
+ mac_tx_stats_t *mac_tx_stat;
+ int i;
+
+ for (i = 0; i < fe.fe_rx_srs_cnt; i++) {
+ mac_srs = (mac_soft_ring_set_t *)(fe.fe_rx_srs[i]);
+ mac_rx_stat = &mac_srs->srs_rx.sr_stat;
+ totibytes += mac_rx_stat->mrs_intrbytes +
+ mac_rx_stat->mrs_pollbytes +
+ mac_rx_stat->mrs_lclbytes;
+ }
+ mac_srs = (mac_soft_ring_set_t *)(fe.fe_tx_srs);
+ if (mac_srs != NULL) {
+ mac_tx_stat = &mac_srs->srs_tx.st_stat;
+ totobytes = mac_tx_stat->mts_obytes;
+ }
mdb_printf("%?p %-32s %16llu %16llu\n",
- addr, fe.fe_flow_name, fe.fe_flowstats.fs_rbytes,
- fe.fe_flowstats.fs_obytes);
+ addr, fe.fe_flow_name, totibytes, totobytes);
+
break;
}
}
@@ -444,6 +467,10 @@ mac_srs_txmode2str(mac_tx_srs_mode_t mode)
return ("BW");
case SRS_TX_BW_FANOUT:
return ("BWFO");
+ case SRS_TX_AGGR:
+ return ("AG");
+ case SRS_TX_BW_AGGR:
+ return ("BWAG");
}
return ("--");
}
@@ -460,6 +487,7 @@ mac_srs_help(void)
"\t-s\tdisplay statistics for RX or TX side\n"
"\t-c\tdisplay CPU binding for RX or TX side\n"
"\t-v\tverbose flag for CPU binding to list cpus\n"
+ "\t-i\tdisplay mac_ring_t and interrupt information\n"
"Note: use -r or -t (to specify RX or TX side respectively) along "
"with -c or -s\n");
mdb_printf("\n%<u>Interpreting TX Modes%</u>\n");
@@ -468,6 +496,8 @@ mac_srs_help(void)
mdb_printf("\t FO --> Fanout\n");
mdb_printf("\t BW --> Bandwidth\n");
mdb_printf("\tBWFO --> Bandwidth Fanout\n");
+ mdb_printf("\t AG --> Aggr\n");
+ mdb_printf("\tBWAG --> Bandwidth Aggr\n");
}
/*
@@ -520,6 +550,7 @@ mac_srs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
't', MDB_OPT_SETBITS, MAC_SRS_TX, &args,
'c', MDB_OPT_SETBITS, MAC_SRS_CPU, &args,
'v', MDB_OPT_SETBITS, MAC_SRS_VERBOSE, &args,
+ 'i', MDB_OPT_SETBITS, MAC_SRS_INTR, &args,
's', MDB_OPT_SETBITS, MAC_SRS_STAT, &args) != argc) {
return (DCMD_USAGE);
}
@@ -576,7 +607,7 @@ mac_srs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
"%08x %08x %8d %8d %3d\n",
addr, mci.mci_name, mac_srs_txmode2str(srs.srs_tx.st_mode),
srs.srs_state, srs.srs_type, srs.srs_count, srs.srs_size,
- srs.srs_oth_ring_count);
+ srs.srs_tx_ring_count);
break;
}
case MAC_SRS_RXCPU: {
@@ -596,30 +627,148 @@ mac_srs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
return (DCMD_OK);
mdb_printf("%?p %-20s %-4d %-4d "
"%-6d %-4d %-7d\n",
- addr, mci.mci_name, mc.mc_ncpus, mc.mc_pollid,
- mc.mc_workerid, mc.mc_intr_cpu, mc.mc_fanout_cnt);
+ addr, mci.mci_name, mc.mc_ncpus, mc.mc_rx_pollid,
+ mc.mc_rx_workerid, mc.mc_rx_intr_cpu, mc.mc_rx_fanout_cnt);
break;
}
case MAC_SRS_TXCPU: {
mac_cpus_t mc = srs.srs_cpu;
+ mac_soft_ring_t *s_ringp, s_ring;
+ boolean_t first = B_TRUE;
+ int i;
if (DCMD_HDRSPEC(flags)) {
- mdb_printf("%?s %-20s %-4s %-6s "
- "%-4s %-7s\n",
- "", "", "NUM", "WORKER",
- "INTR", "FANOUT");
- mdb_printf("%<u>%?s %-20s %-4s %-6s "
- "%-4s %-7s%</u>\n",
- "ADDR", "LINK_NAME", "CPUS", "CPU",
- "CPU", "CPU_CNT");
+ mdb_printf("%?s %-12s %?s %8s %8s %8s\n",
+ "", "", "SOFT", "WORKER", "INTR", "RETARGETED");
+ mdb_printf("%<u>%?s %-12s %?s %8s %8s %8s%</u>\n",
+ "ADDR", "LINK_NAME", "RING", "CPU", "CPU", "CPU");
}
- if ((args & MAC_SRS_TX) && !(srs.srs_type & SRST_TX))
+ if (!(srs.srs_type & SRST_TX))
return (DCMD_OK);
- mdb_printf("%?p %-20s %-4d "
- "%-6d %-4d %-7d\n",
- addr, mci.mci_name, mc.mc_ncpus,
- mc.mc_workerid, mc.mc_intr_cpu, mc.mc_fanout_cnt);
+
+ mdb_printf("%?p %-12s ", addr, mci.mci_name);
+
+ /*
+ * Case of no soft rings, print the info from
+ * mac_srs_tx_t.
+ */
+ if (srs.srs_tx_ring_count == 0) {
+ mdb_printf("%?p %8d %8d %8d\n",
+ 0, mc.mc_tx_fanout_cpus[0],
+ mc.mc_tx_intr_cpu[0],
+ mc.mc_tx_retargeted_cpu[0]);
+ break;
+ }
+
+ for (s_ringp = srs.srs_soft_ring_head, i = 0; s_ringp != NULL;
+ s_ringp = s_ring.s_ring_next, i++) {
+ (void) mdb_vread(&s_ring, sizeof (s_ring),
+ (uintptr_t)s_ringp);
+ if (first) {
+ mdb_printf("%?p %8d %8d %8d\n",
+ s_ringp, mc.mc_tx_fanout_cpus[i],
+ mc.mc_tx_intr_cpu[i],
+ mc.mc_tx_retargeted_cpu[i]);
+ first = B_FALSE;
+ continue;
+ }
+ mdb_printf("%?s %-12s %?p %8d %8d %8d\n",
+ "", "", s_ringp, mc.mc_tx_fanout_cpus[i],
+ mc.mc_tx_intr_cpu[i], mc.mc_tx_retargeted_cpu[i]);
+ }
+ break;
+ }
+ case MAC_SRS_TXINTR: {
+ mac_cpus_t mc = srs.srs_cpu;
+ mac_soft_ring_t *s_ringp, s_ring;
+ mac_ring_t *m_ringp, m_ring;
+ boolean_t first = B_TRUE;
+ int i;
+
+ if (DCMD_HDRSPEC(flags)) {
+ mdb_printf("%?s %-12s %?s %8s %?s %6s %6s\n",
+ "", "", "SOFT", "WORKER", "MAC", "", "INTR");
+ mdb_printf("%<u>%?s %-12s %?s %8s %?s %6s %6s%</u>\n",
+ "ADDR", "LINK_NAME", "RING", "CPU", "RING",
+ "SHARED", "CPU");
+ }
+ if (!(srs.srs_type & SRST_TX))
+ return (DCMD_OK);
+
+ mdb_printf("%?p %-12s ", addr, mci.mci_name);
+
+ /*
+ * Case of no soft rings, print the info from
+ * mac_srs_tx_t.
+ */
+ if (srs.srs_tx_ring_count == 0) {
+ m_ringp = srs.srs_tx.st_arg2;
+ if (m_ringp != NULL) {
+ (void) mdb_vread(&m_ring, sizeof (m_ring),
+ (uintptr_t)m_ringp);
+ mdb_printf("%?p %8d %?p %6d %6d\n",
+ 0, mc.mc_tx_fanout_cpus[0], m_ringp,
+ m_ring.mr_info.mri_intr.mi_ddi_shared,
+ mc.mc_tx_retargeted_cpu[0]);
+ } else {
+ mdb_printf("%?p %8d %?p %6d %6d\n",
+ 0, mc.mc_tx_fanout_cpus[0], 0,
+ 0, mc.mc_tx_retargeted_cpu[0]);
+ }
+ break;
+ }
+
+ for (s_ringp = srs.srs_soft_ring_head, i = 0; s_ringp != NULL;
+ s_ringp = s_ring.s_ring_next, i++) {
+ (void) mdb_vread(&s_ring, sizeof (s_ring),
+ (uintptr_t)s_ringp);
+ m_ringp = s_ring.s_ring_tx_arg2;
+ (void) mdb_vread(&m_ring, sizeof (m_ring),
+ (uintptr_t)m_ringp);
+ if (first) {
+ mdb_printf("%?p %8d %?p %6d %6d\n",
+ s_ringp, mc.mc_tx_fanout_cpus[i],
+ m_ringp,
+ m_ring.mr_info.mri_intr.mi_ddi_shared,
+ mc.mc_tx_retargeted_cpu[i]);
+ first = B_FALSE;
+ continue;
+ }
+ mdb_printf("%?s %-12s %?p %8d %?p %6d %6d\n",
+ "", "", s_ringp, mc.mc_tx_fanout_cpus[i],
+ m_ringp, m_ring.mr_info.mri_intr.mi_ddi_shared,
+ mc.mc_tx_retargeted_cpu[i]);
+ }
+ break;
+ }
+ case MAC_SRS_RXINTR: {
+ mac_cpus_t mc = srs.srs_cpu;
+ mac_ring_t *m_ringp, m_ring;
+
+ if (DCMD_HDRSPEC(flags)) {
+ mdb_printf("%?s %-12s %?s %8s %6s %6s\n",
+ "", "", "MAC", "", "POLL", "INTR");
+ mdb_printf("%<u>%?s %-12s %?s %8s %6s %6s%</u>\n",
+ "ADDR", "LINK_NAME", "RING", "SHARED", "CPU",
+ "CPU");
+ }
+ if ((args & MAC_SRS_RX) && (srs.srs_type & SRST_TX))
+ return (DCMD_OK);
+
+ mdb_printf("%?p %-12s ", addr, mci.mci_name);
+
+ m_ringp = srs.srs_ring;
+ if (m_ringp != NULL) {
+ (void) mdb_vread(&m_ring, sizeof (m_ring),
+ (uintptr_t)m_ringp);
+ mdb_printf("%?p %8d %6d %6d\n",
+ m_ringp, m_ring.mr_info.mri_intr.mi_ddi_shared,
+ mc.mc_rx_pollid, mc.mc_rx_intr_cpu);
+ } else {
+ mdb_printf("%?p %8d %6d %6d\n",
+ 0, 0, mc.mc_rx_pollid, mc.mc_rx_intr_cpu);
+ }
break;
}
case MAC_SRS_RXCPUVERBOSE:
@@ -640,8 +789,8 @@ mac_srs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
((args & MAC_SRS_RX) && (srs.srs_type & SRST_TX)))
return (DCMD_OK);
mdb_printf("%?p %-20s %-20d %-20d\n", addr, mci.mci_name,
- mc.mc_ncpus, mc.mc_fanout_cnt);
- if (mc.mc_ncpus == 0 && mc.mc_fanout_cnt == 0)
+ mc.mc_ncpus, mc.mc_rx_fanout_cnt);
+ if (mc.mc_ncpus == 0 && mc.mc_rx_fanout_cnt == 0)
break;
/* print all cpus and cpus for soft rings */
while (!cpu_done || !fanout_done) {
@@ -658,14 +807,15 @@ mac_srs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
else
mdb_printf("%*s", len, "");
fanout_done = mac_srs_print_cpu(&fanout_index,
- mc.mc_fanout_cnt, mc.mc_fanout_cpus, NULL);
+ mc.mc_rx_fanout_cnt,
+ mc.mc_rx_fanout_cpus, NULL);
}
mdb_printf("\n");
}
break;
}
case MAC_SRS_RXSTAT: {
- mac_srs_rx_t srs_rx = srs.srs_rx;
+ mac_rx_stats_t *mac_rx_stat = &srs.srs_rx.sr_stat;
if (DCMD_HDRSPEC(flags)) {
mdb_printf("%?s %-16s %8s %8s "
@@ -682,13 +832,14 @@ mac_srs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
mdb_printf("%?p %-16s %8d "
"%8d %8d "
"%8d %8d\n",
- addr, mci.mci_name, srs_rx.sr_intr_count,
- srs_rx.sr_poll_count, srs_rx.sr_chain_cnt_undr10,
- srs_rx.sr_chain_cnt_10to50, srs_rx.sr_chain_cnt_over50);
+ addr, mci.mci_name, mac_rx_stat->mrs_intrcnt,
+ mac_rx_stat->mrs_pollcnt, mac_rx_stat->mrs_chaincntundr10,
+ mac_rx_stat->mrs_chaincnt10to50,
+ mac_rx_stat->mrs_chaincntover50);
break;
}
case MAC_SRS_TXSTAT: {
- mac_srs_tx_t srs_tx = srs.srs_tx;
+ mac_tx_stats_t *mac_tx_stat = &srs.srs_tx.st_stat;
mac_soft_ring_t *s_ringp, s_ring;
boolean_t first = B_TRUE;
@@ -708,10 +859,11 @@ mac_srs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
* Case of no soft rings, print the info from
* mac_srs_tx_t.
*/
- if (srs.srs_oth_ring_count == 0) {
+ if (srs.srs_tx_ring_count == 0) {
mdb_printf("%?p %8d %8d %8d\n",
- 0, srs_tx.st_drop_count, srs_tx.st_blocked_cnt,
- srs_tx.st_unblocked_cnt);
+ 0, mac_tx_stat->mts_sdrops,
+ mac_tx_stat->mts_blockcnt,
+ mac_tx_stat->mts_unblockcnt);
break;
}
@@ -719,18 +871,19 @@ mac_srs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
s_ringp = s_ring.s_ring_next) {
(void) mdb_vread(&s_ring, sizeof (s_ring),
(uintptr_t)s_ringp);
+ mac_tx_stat = &s_ring.s_st_stat;
if (first) {
mdb_printf("%?p %8d %8d %8d\n",
- s_ringp, s_ring.s_ring_drops,
- s_ring.s_ring_blocked_cnt,
- s_ring.s_ring_unblocked_cnt);
+ s_ringp, mac_tx_stat->mts_sdrops,
+ mac_tx_stat->mts_blockcnt,
+ mac_tx_stat->mts_unblockcnt);
first = B_FALSE;
continue;
}
mdb_printf("%?s %-20s %?p %8d %8d %8d\n",
- "", "", s_ringp, s_ring.s_ring_drops,
- s_ring.s_ring_blocked_cnt,
- s_ring.s_ring_unblocked_cnt);
+ "", "", s_ringp, mac_tx_stat->mts_sdrops,
+ mac_tx_stat->mts_blockcnt,
+ mac_tx_stat->mts_unblockcnt);
}
break;
}
@@ -853,8 +1006,9 @@ mac_ring_help(void)
static const mdb_dcmd_t dcmds[] = {
{"mac_flow", "?[-u] [-aprtsm]", "display Flow Entry structures",
mac_flow_dcmd, mac_flow_help},
- {"mac_srs", "?[ -r[s|c[v]] | -t[s|c[v]] ]", "display MAC Soft Ring Set"
- " structures", mac_srs_dcmd, mac_srs_help},
+ {"mac_srs", "?[ -r[i|s|c[v]] | -t[i|s|c[v]] ]",
+ "display MAC Soft Ring Set" " structures", mac_srs_dcmd,
+ mac_srs_help},
{"mac_ring", "?", "display MAC ring (hardware) structures",
mac_ring_dcmd, mac_ring_help},
{ NULL }