app/testpmd: add bitrate statistics calculation

Calculate bitrate statistics using the bitrate stats library. The
resulting statistics can be viewed via proc_info.

Signed-off-by: Remy Horton <remy.horton@intel.com>
This commit is contained in:
Remy Horton 2017-03-30 22:01:00 +01:00 committed by Thomas Monjalon
parent 2ad7ba9a65
commit 7e4441c8ef

View File

@ -1,7 +1,7 @@
/*-
* BSD LICENSE
*
* Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
* Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -79,6 +79,10 @@
#include <rte_pdump.h>
#endif
#include <rte_flow.h>
#include <rte_metrics.h>
#ifdef RTE_LIBRTE_BITRATE
#include <rte_bitrate.h>
#endif
#include "testpmd.h"
@ -323,6 +327,9 @@ uint16_t nb_rx_queue_stats_mappings = 0;
unsigned max_socket = 0;
/* Bitrate statistics */
struct rte_stats_bitrates *bitrate_data;
/* Forward function declarations */
static void map_port_queue_stats_mapping_registers(uint8_t pi, struct rte_port *port);
static void check_all_ports_link_status(uint32_t port_mask);
@ -922,12 +929,30 @@ run_pkt_fwd_on_lcore(struct fwd_lcore *fc, packet_fwd_t pkt_fwd)
struct fwd_stream **fsm;
streamid_t nb_fs;
streamid_t sm_id;
#ifdef RTE_LIBRTE_BITRATE
uint64_t tics_per_1sec;
uint64_t tics_datum;
uint64_t tics_current;
uint8_t idx_port, cnt_ports;
cnt_ports = rte_eth_dev_count();
tics_datum = rte_rdtsc();
tics_per_1sec = rte_get_timer_hz();
#endif
fsm = &fwd_streams[fc->stream_idx];
nb_fs = fc->stream_nb;
do {
for (sm_id = 0; sm_id < nb_fs; sm_id++)
(*pkt_fwd)(fsm[sm_id]);
#ifdef RTE_LIBRTE_BITRATE
tics_current = rte_rdtsc();
if (tics_current - tics_datum >= tics_per_1sec) {
/* Periodic bitrate calculation */
for (idx_port = 0; idx_port < cnt_ports; idx_port++)
rte_stats_bitrate_calc(bitrate_data, idx_port);
tics_datum = tics_current;
}
#endif
} while (! fc->stopped);
}
@ -2128,6 +2153,18 @@ main(int argc, char** argv)
FOREACH_PORT(port_id, ports)
rte_eth_promiscuous_enable(port_id);
/* Init metrics library */
rte_metrics_init(rte_socket_id());
/* Setup bitrate stats */
#ifdef RTE_LIBRTE_BITRATE
bitrate_data = rte_stats_bitrate_create();
if (bitrate_data == NULL)
rte_exit(EXIT_FAILURE, "Could not allocate bitrate data.\n");
rte_stats_bitrate_reg(bitrate_data);
#endif
#ifdef RTE_LIBRTE_CMDLINE
if (interactive == 1) {
if (auto_start) {