return 0;
}
+static int parse_cmd_dp_core_stats(const char *str, struct input *input)
+{
+ unsigned lcores[RTE_MAX_LCORE], lcore_id, task_id, nb_cores;
+
+ if (parse_core_task(str, lcores, &task_id, &nb_cores))
+ return -1;
+
+ if (cores_task_are_valid(lcores, task_id, nb_cores)) {
+ for (unsigned int i = 0; i < nb_cores; i++) {
+ lcore_id = lcores[i];
+ uint64_t tot_rx = stats_core_task_tot_rx(lcore_id, task_id);
+ uint64_t tot_tx = stats_core_task_tot_tx(lcore_id, task_id);
+ uint64_t tot_rx_non_dp = stats_core_task_tot_rx_non_dp(lcore_id, task_id);
+ uint64_t tot_tx_non_dp = stats_core_task_tot_tx_non_dp(lcore_id, task_id);
+ uint64_t tot_drop = stats_core_task_tot_drop(lcore_id, task_id);
+ uint64_t last_tsc = stats_core_task_last_tsc(lcore_id, task_id);
+
+ if (input->reply) {
+ char buf[128];
+ snprintf(buf, sizeof(buf),
+ "%"PRIu64",%"PRIu64",%"PRIu64",%"PRIu64",%"PRIu64",%"PRIu64",%"PRIu64"\n",
+ tot_rx, tot_tx, tot_rx_non_dp, tot_tx_non_dp, tot_drop, last_tsc, rte_get_tsc_hz());
+ input->reply(input, buf, strlen(buf));
+ }
+ else {
+ plog_info("RX: %"PRIu64", TX: %"PRIu64", RX_NON_DP: %"PRIu64", TX_NON_DP: %"PRIu64", DROP: %"PRIu64"\n",
+ tot_rx, tot_tx, tot_rx_non_dp, tot_tx_non_dp, tot_drop);
+ }
+ }
+ }
+ return 0;
+}
+
static int parse_cmd_lat_stats(const char *str, struct input *input)
{
unsigned lcores[RTE_MAX_LCORE], lcore_id, task_id, nb_cores;
{"lat packets", "<core id> <task id>", "Print the latency for each of the last set of packets", parse_cmd_lat_packets},
{"accuracy limit", "<core id> <task id> <nsec>", "Only consider latency of packets that were measured with an error no more than <nsec>", parse_cmd_accuracy},
{"core stats", "<core id> <task id>", "Print rx/tx/drop for task <task id> running on core <core id>", parse_cmd_core_stats},
+ {"dp core stats", "<core id> <task id>", "Print rx/tx/non_dp_rx/non_dp_tx/drop for task <task id> running on core <core id>", parse_cmd_dp_core_stats},
{"port_stats", "<port id>", "Print rate for no_mbufs, ierrors + imissed, rx_bytes, tx_bytes, rx_pkts, tx_pkts; totals for RX, TX, no_mbufs, ierrors + imissed for port <port id>", parse_cmd_port_stats},
{"multi port stats", "<port list>", "Get stats for multiple ports, semi-colon separated: port id, total for rx_pkts, tx_pkts, no_mbufs, ierrors + imissed, last_tsc", parse_cmd_multi_port_stats},
{"read reg", "", "Read register", parse_cmd_read_reg},
static struct display_column *mbm_tot_col;
static struct display_column *mbm_loc_col;
static struct display_column *frac_col;
+static struct display_column *rx_non_dp_col;
+static struct display_column *tx_non_dp_col;
static void stats_display_core_task_entry(struct lcore_cfg *lconf, struct task_args *targ, unsigned row)
{
handled_col = display_table_add_col(stats);
display_column_init(handled_col, "Handled (K)", 9);
+ rx_non_dp_col = display_table_add_col(stats);
+ display_column_init(rx_non_dp_col, "Rx non DP (K)", 9);
+
+ tx_non_dp_col = display_table_add_col(stats);
+ display_column_init(tx_non_dp_col, "Tx non DP (K)", 9);
+
if (stats_cpu_freq_enabled()) {
struct display_table *other = display_page_add_table(&display_page_tasks);
handled_col = display_table_add_col(stats);
display_column_init(handled_col, "Handled (K)", 14);
+ rx_non_dp_col = display_table_add_col(stats);
+ display_column_init(rx_non_dp_col, "RX non DP (K)", 14);
+
+ tx_non_dp_col = display_table_add_col(stats);
+ display_column_init(tx_non_dp_col, "TX non DP (K)", 14);
+
if (stats_cmt_enabled()) {
struct display_table *other = display_page_add_table(&display_page_tasks);
print_kpps(tx_fail_col, row, last->drop_tx_fail - prev->drop_tx_fail, delta_t);
print_kpps(discard_col, row, last->drop_discard - prev->drop_discard, delta_t);
print_kpps(handled_col, row, last->drop_handled - prev->drop_handled, delta_t);
+ print_kpps(rx_non_dp_col, row, last->rx_non_dp - prev->rx_non_dp, delta_t);
+ print_kpps(tx_non_dp_col, row, last->tx_non_dp - prev->tx_non_dp, delta_t);
if (stats_cpu_freq_enabled()) {
uint8_t lcore_stat_id = t->lcore_stat_id;
display_column_print(tx_fail_col, row, "%lu", ts->tot_drop_tx_fail);
display_column_print(discard_col, row, "%lu", ts->tot_drop_discard);
display_column_print(handled_col, row, "%lu", ts->tot_drop_handled);
+ display_column_print(rx_non_dp_col, row, "%lu", ts->tot_rx_non_dp);
+ display_column_print(tx_non_dp_col, row, "%lu", ts->tot_tx_non_dp);
if (stats_cmt_enabled()) {
struct lcore_stats *c = stats_get_lcore_stats(t->lcore_stat_id);
task_lat_update_lat_test(task);
// Remember those packets with bad length or bad signature
+ uint32_t non_dp_count = 0;
uint64_t pkt_bad_len_sig[(MAX_RX_PKT_ALL + 63) / 64];
#define BIT64_SET(a64, bit) a64[bit / 64] |= (((uint64_t)1) << (bit & 63))
#define BIT64_CLR(a64, bit) a64[bit / 64] &= ~(((uint64_t)1) << (bit & 63))
task->rx_pkt_meta[j].hdr = rte_pktmbuf_mtod(mbuf, uint8_t *);
// Remember those packets which are too short to hold the values that we expect
- if (unlikely(rte_pktmbuf_pkt_len(mbuf) < task->min_pkt_len))
+ if (unlikely(rte_pktmbuf_pkt_len(mbuf) < task->min_pkt_len)) {
BIT64_SET(pkt_bad_len_sig, j);
- else
+ non_dp_count++;
+ } else
BIT64_CLR(pkt_bad_len_sig, j);
}
// Remember those packets with bad signature
if (likely(*(uint32_t *)(task->rx_pkt_meta[j].hdr + task->sig_pos) == task->sig))
task->rx_pkt_meta[j].pkt_tx_time = *(uint32_t *)(task->rx_pkt_meta[j].hdr + task->lat_pos);
- else
+ else {
BIT64_SET(pkt_bad_len_sig, j);
+ non_dp_count++;
+ }
}
} else {
for (uint16_t j = 0; j < n_pkts; ++j) {
rx_time_err = pkt_rx_time64 - (task->begin >> LATENCY_ACCURACY);
}
+ TASK_STATS_ADD_RX_NON_DP(&tbase->aux->stats, non_dp_count);
for (uint16_t j = 0; j < n_pkts; ++j) {
// Used to display % of packets within accuracy limit vs. total number of packets (used_col)
task->lat_test->tot_all_pkts++;
break;
case ARP_REPLY_FROM_CTRL:
case ARP_REQ_FROM_CTRL:
+ TASK_STATS_ADD_TX_NON_DP(&tbase->aux->stats, 1);
out[0] = 0;
tbase->aux->tx_pkt_l2(tbase, &mbufs[j], 1, out);
break;
}
if (skip)
- TASK_STATS_ADD_DROP_HANDLED(&tbase->aux->stats, skip);
+ TASK_STATS_ADD_RX_NON_DP(&tbase->aux->stats, skip);
if (likely(nb_rx > 0)) {
TASK_STATS_ADD_RX(&tbase->aux->stats, nb_rx);
return nb_rx - skip;
}
if (skip)
- TASK_STATS_ADD_DROP_HANDLED(&tbase->aux->stats, skip);
+ TASK_STATS_ADD_RX_NON_DP(&tbase->aux->stats, skip);
if (likely(nb_rx > 0)) {
TASK_STATS_ADD_RX(&tbase->aux->stats, nb_rx);
return nb_rx - skip;
return stats_get_task_stats_sample(c, t, 1)->drop_handled;
}
+static uint64_t sp_task_rx_non_dp(int argc, const char *argv[])
+{
+ struct task_stats_sample *last;
+ uint32_t c, t;
+ if (args_to_core_task(argv[0], argv[1], &c, &t))
+ return -1;
+ return stats_get_task_stats_sample(c, t, 1)->rx_non_dp;
+}
+
+static uint64_t sp_task_tx_non_dp(int argc, const char *argv[])
+{
+ struct task_stats_sample *last;
+ uint32_t c, t;
+ if (args_to_core_task(argv[0], argv[1], &c, &t))
+ return -1;
+ return stats_get_task_stats_sample(c, t, 1)->tx_non_dp;
+}
static uint64_t sp_task_rx_bytes(int argc, const char *argv[])
{
return -1;
{"task.core(#).task(#).rx_prio(#)", sp_task_rx_prio},
{"task.core(#).task(#).max_irq", sp_task_max_irq},
{"task.core(#).task(#).irq(#)", sp_task_irq},
+ {"task.core(#).task(#).rx_non_dp", sp_task_rx_non_dp},
+ {"task.core(#).task(#).tx_non_dp", sp_task_tx_non_dp},
{"port(#).no_mbufs", sp_port_no_mbufs},
{"port(#).ierrors", sp_port_ierrors},
cur_task_stats->tot_drop_tx_fail = 0;
cur_task_stats->tot_drop_discard = 0;
cur_task_stats->tot_drop_handled = 0;
+ cur_task_stats->tot_rx_non_dp = 0;
+ cur_task_stats->tot_tx_non_dp = 0;
}
}
lcore_task_stats_all[lcore_id].task_stats[task_id].tot_drop_handled;
}
+uint64_t stats_core_task_tot_tx_non_dp(uint8_t lcore_id, uint8_t task_id)
+{
+ return lcore_task_stats_all[lcore_id].task_stats[task_id].tot_tx_non_dp;
+}
+
+uint64_t stats_core_task_tot_rx_non_dp(uint8_t lcore_id, uint8_t task_id)
+{
+ return lcore_task_stats_all[lcore_id].task_stats[task_id].tot_rx_non_dp;
+}
+
uint64_t stats_core_task_last_tsc(uint8_t lcore_id, uint8_t task_id)
{
return lcore_task_stats_all[lcore_id].task_stats[task_id].sample[last_stat].tsc;
cur_task_stats->tot_drop_tx_fail += last->drop_tx_fail - prev->drop_tx_fail;
cur_task_stats->tot_drop_discard += last->drop_discard - prev->drop_discard;
cur_task_stats->tot_drop_handled += last->drop_handled - prev->drop_handled;
+ cur_task_stats->tot_rx_non_dp += last->rx_non_dp - prev->rx_non_dp;
+ cur_task_stats->tot_tx_non_dp += last->tx_non_dp - prev->tx_non_dp;
}
}
last->tx_bytes = stats->tx_bytes;
last->rx_bytes = stats->rx_bytes;
last->drop_bytes = stats->drop_bytes;
+ last->rx_non_dp = stats->rx_non_dp;
+ last->tx_non_dp = stats->tx_non_dp;
after = rte_rdtsc();
last->tsc = (before >> 1) + (after >> 1);
}
uint64_t rx_bytes;
uint64_t tx_bytes;
uint64_t drop_bytes;
+ uint64_t rx_non_dp;
+ uint64_t tx_non_dp;
} __attribute__((packed)) __rte_cache_aligned;
#ifdef PROX_STATS
(stats)->rx_pkt_count += ntx; \
} while (0) \
+#define TASK_STATS_ADD_RX_NON_DP(stats, ntx) do { \
+ (stats)->rx_non_dp += ntx; \
+ } while(0)
+
+#define TASK_STATS_ADD_TX_NON_DP(stats, ntx) do { \
+ (stats)->tx_non_dp += ntx; \
+ } while(0)
+
#define TASK_STATS_ADD_RX_BYTES(stats, bytes) do { \
(stats)->rx_bytes += bytes; \
} while (0) \
uint64_t rx_bytes;
uint64_t tx_bytes;
uint64_t drop_bytes;
+ uint64_t rx_non_dp;
+ uint64_t tx_non_dp;
};
struct task_stats {
uint64_t tot_drop_discard;
uint64_t tot_drop_handled;
uint64_t tot_rx_pkt_count;
+ uint64_t tot_tx_non_dp;
+ uint64_t tot_rx_non_dp;
struct task_stats_sample sample[2];
uint64_t stats_core_task_tot_tx(uint8_t lcore_id, uint8_t task_id);
uint64_t stats_core_task_tot_drop(uint8_t lcore_id, uint8_t task_id);
uint64_t stats_core_task_last_tsc(uint8_t lcore_id, uint8_t task_id);
+uint64_t stats_core_task_tot_rx_non_dp(uint8_t lcore_id, uint8_t task_id);
+uint64_t stats_core_task_tot_tx_non_dp(uint8_t lcore_id, uint8_t task_id);
#endif /* _STATS_TASK_H_ */