net/i40e: fix Rx packet statistics
Some packets are discarded by the NIC because they are larger than the MTU, these packets should be counted as "RX error" instead of "RX packet", for example: pkt1 = Ether()/IP()/Raw('x' * 1400) pkt2 = Ether()/IP()/Raw('x' * 1500) ---------------- Forward statistics for port 0 ----------------- RX-packets: 2 RX-dropped: 0 RX-total: 2 TX-packets: 1 TX-dropped: 0 TX-total: 1 ---------------------------------------------------------------- Here the packet pkt2 has been discarded, but still was counted by "RX-packets" The register 'GL_RXERR1' can count above discarded packets. This patch adds reading and calculation of the 'GL_RXERR1' counter when reporting DPDK statistics. Fixes: f4a91c38b4ad ("i40e: add extended stats") Cc: stable@dpdk.org Signed-off-by: Alvin Zhang <alvinx.zhang@intel.com> Acked-by: Qi Zhang <qi.z.zhang@intel.com>
This commit is contained in:
parent
9381e4c04b
commit
39e4a2577f
@ -520,7 +520,7 @@ static const struct eth_dev_ops i40e_eth_dev_ops = {
|
|||||||
/* store statistics names and its offset in stats structure */
|
/* store statistics names and its offset in stats structure */
|
||||||
struct rte_i40e_xstats_name_off {
|
struct rte_i40e_xstats_name_off {
|
||||||
char name[RTE_ETH_XSTATS_NAME_SIZE];
|
char name[RTE_ETH_XSTATS_NAME_SIZE];
|
||||||
unsigned offset;
|
int offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct rte_i40e_xstats_name_off rte_i40e_stats_strings[] = {
|
static const struct rte_i40e_xstats_name_off rte_i40e_stats_strings[] = {
|
||||||
@ -530,6 +530,8 @@ static const struct rte_i40e_xstats_name_off rte_i40e_stats_strings[] = {
|
|||||||
{"rx_dropped_packets", offsetof(struct i40e_eth_stats, rx_discards)},
|
{"rx_dropped_packets", offsetof(struct i40e_eth_stats, rx_discards)},
|
||||||
{"rx_unknown_protocol_packets", offsetof(struct i40e_eth_stats,
|
{"rx_unknown_protocol_packets", offsetof(struct i40e_eth_stats,
|
||||||
rx_unknown_protocol)},
|
rx_unknown_protocol)},
|
||||||
|
{"rx_size_error_packets", offsetof(struct i40e_pf, rx_err1) -
|
||||||
|
offsetof(struct i40e_pf, stats)},
|
||||||
{"tx_unicast_packets", offsetof(struct i40e_eth_stats, tx_unicast)},
|
{"tx_unicast_packets", offsetof(struct i40e_eth_stats, tx_unicast)},
|
||||||
{"tx_multicast_packets", offsetof(struct i40e_eth_stats, tx_multicast)},
|
{"tx_multicast_packets", offsetof(struct i40e_eth_stats, tx_multicast)},
|
||||||
{"tx_broadcast_packets", offsetof(struct i40e_eth_stats, tx_broadcast)},
|
{"tx_broadcast_packets", offsetof(struct i40e_eth_stats, tx_broadcast)},
|
||||||
@ -3202,6 +3204,10 @@ i40e_read_stats_registers(struct i40e_pf *pf, struct i40e_hw *hw)
|
|||||||
pf->offset_loaded,
|
pf->offset_loaded,
|
||||||
&os->eth.rx_unknown_protocol,
|
&os->eth.rx_unknown_protocol,
|
||||||
&ns->eth.rx_unknown_protocol);
|
&ns->eth.rx_unknown_protocol);
|
||||||
|
i40e_stat_update_48(hw, I40E_GL_RXERR1_H(hw->pf_id + I40E_MAX_VF),
|
||||||
|
I40E_GL_RXERR1_L(hw->pf_id + I40E_MAX_VF),
|
||||||
|
pf->offset_loaded, &pf->rx_err1_offset,
|
||||||
|
&pf->rx_err1);
|
||||||
i40e_stat_update_48_in_64(hw, I40E_GLPRT_GOTCH(hw->port),
|
i40e_stat_update_48_in_64(hw, I40E_GLPRT_GOTCH(hw->port),
|
||||||
I40E_GLPRT_GOTCL(hw->port),
|
I40E_GLPRT_GOTCL(hw->port),
|
||||||
pf->offset_loaded, &os->eth.tx_bytes,
|
pf->offset_loaded, &os->eth.tx_bytes,
|
||||||
@ -3401,7 +3407,8 @@ i40e_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
|
|||||||
stats->ipackets = pf->main_vsi->eth_stats.rx_unicast +
|
stats->ipackets = pf->main_vsi->eth_stats.rx_unicast +
|
||||||
pf->main_vsi->eth_stats.rx_multicast +
|
pf->main_vsi->eth_stats.rx_multicast +
|
||||||
pf->main_vsi->eth_stats.rx_broadcast -
|
pf->main_vsi->eth_stats.rx_broadcast -
|
||||||
pf->main_vsi->eth_stats.rx_discards;
|
pf->main_vsi->eth_stats.rx_discards -
|
||||||
|
pf->rx_err1;
|
||||||
stats->opackets = ns->eth.tx_unicast +
|
stats->opackets = ns->eth.tx_unicast +
|
||||||
ns->eth.tx_multicast +
|
ns->eth.tx_multicast +
|
||||||
ns->eth.tx_broadcast;
|
ns->eth.tx_broadcast;
|
||||||
@ -3415,7 +3422,8 @@ i40e_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
|
|||||||
pf->main_vsi->eth_stats.rx_discards;
|
pf->main_vsi->eth_stats.rx_discards;
|
||||||
stats->ierrors = ns->crc_errors +
|
stats->ierrors = ns->crc_errors +
|
||||||
ns->rx_length_errors + ns->rx_undersize +
|
ns->rx_length_errors + ns->rx_undersize +
|
||||||
ns->rx_oversize + ns->rx_fragments + ns->rx_jabber;
|
ns->rx_oversize + ns->rx_fragments + ns->rx_jabber +
|
||||||
|
pf->rx_err1;
|
||||||
|
|
||||||
if (pf->vfs) {
|
if (pf->vfs) {
|
||||||
for (i = 0; i < pf->vf_num; i++) {
|
for (i = 0; i < pf->vf_num; i++) {
|
||||||
@ -6197,6 +6205,8 @@ i40e_pf_setup(struct i40e_pf *pf)
|
|||||||
memset(&pf->stats_offset, 0, sizeof(struct i40e_hw_port_stats));
|
memset(&pf->stats_offset, 0, sizeof(struct i40e_hw_port_stats));
|
||||||
memset(&pf->internal_stats, 0, sizeof(struct i40e_eth_stats));
|
memset(&pf->internal_stats, 0, sizeof(struct i40e_eth_stats));
|
||||||
memset(&pf->internal_stats_offset, 0, sizeof(struct i40e_eth_stats));
|
memset(&pf->internal_stats_offset, 0, sizeof(struct i40e_eth_stats));
|
||||||
|
pf->rx_err1 = 0;
|
||||||
|
pf->rx_err1_offset = 0;
|
||||||
|
|
||||||
ret = i40e_pf_get_switch_config(pf);
|
ret = i40e_pf_get_switch_config(pf);
|
||||||
if (ret != I40E_SUCCESS) {
|
if (ret != I40E_SUCCESS) {
|
||||||
|
@ -20,6 +20,13 @@
|
|||||||
#include "base/i40e_type.h"
|
#include "base/i40e_type.h"
|
||||||
#include "base/virtchnl.h"
|
#include "base/virtchnl.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _i=0...143,
|
||||||
|
* counters 0-127 are for the 128 VFs,
|
||||||
|
* counters 128-143 are for the 16 PFs
|
||||||
|
*/
|
||||||
|
#define I40E_GL_RXERR1_H(_i) (0x00318004 + ((_i) * 8))
|
||||||
|
|
||||||
#define I40E_VLAN_TAG_SIZE 4
|
#define I40E_VLAN_TAG_SIZE 4
|
||||||
|
|
||||||
#define I40E_AQ_LEN 32
|
#define I40E_AQ_LEN 32
|
||||||
@ -1114,6 +1121,9 @@ struct i40e_pf {
|
|||||||
|
|
||||||
struct i40e_hw_port_stats stats_offset;
|
struct i40e_hw_port_stats stats_offset;
|
||||||
struct i40e_hw_port_stats stats;
|
struct i40e_hw_port_stats stats;
|
||||||
|
u64 rx_err1; /* rxerr1 */
|
||||||
|
u64 rx_err1_offset;
|
||||||
|
|
||||||
/* internal packet statistics, it should be excluded from the total */
|
/* internal packet statistics, it should be excluded from the total */
|
||||||
struct i40e_eth_stats internal_stats_offset;
|
struct i40e_eth_stats internal_stats_offset;
|
||||||
struct i40e_eth_stats internal_stats;
|
struct i40e_eth_stats internal_stats;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user