提交 7812fddc 编写于 作者: S Shannon Nelson 提交者: Jeff Kirsher

i40e: refactor stats collection

Pull the PF stat collection out of the VSI collection routine, and
add a unifying stats update routine to call the various stat collection
routines.

Change-ID: I224192455bb3a6e5dc0a426935e67dffc123e306
Signed-off-by: NShannon Nelson <shannon.nelson@intel.com>
Signed-off-by: NJeff Kirsher <jeffrey.t.kirsher@intel.com>
上级 44033fac
...@@ -720,19 +720,18 @@ static void i40e_update_prio_xoff_rx(struct i40e_pf *pf) ...@@ -720,19 +720,18 @@ static void i40e_update_prio_xoff_rx(struct i40e_pf *pf)
} }
/** /**
* i40e_update_stats - Update the board statistics counters. * i40e_update_vsi_stats - Update the vsi statistics counters.
* @vsi: the VSI to be updated * @vsi: the VSI to be updated
* *
* There are a few instances where we store the same stat in a * There are a few instances where we store the same stat in a
* couple of different structs. This is partly because we have * couple of different structs. This is partly because we have
* the netdev stats that need to be filled out, which is slightly * the netdev stats that need to be filled out, which is slightly
* different from the "eth_stats" defined by the chip and used in * different from the "eth_stats" defined by the chip and used in
* VF communications. We sort it all out here in a central place. * VF communications. We sort it out here.
**/ **/
void i40e_update_stats(struct i40e_vsi *vsi) static void i40e_update_vsi_stats(struct i40e_vsi *vsi)
{ {
struct i40e_pf *pf = vsi->back; struct i40e_pf *pf = vsi->back;
struct i40e_hw *hw = &pf->hw;
struct rtnl_link_stats64 *ons; struct rtnl_link_stats64 *ons;
struct rtnl_link_stats64 *ns; /* netdev stats */ struct rtnl_link_stats64 *ns; /* netdev stats */
struct i40e_eth_stats *oes; struct i40e_eth_stats *oes;
...@@ -741,8 +740,6 @@ void i40e_update_stats(struct i40e_vsi *vsi) ...@@ -741,8 +740,6 @@ void i40e_update_stats(struct i40e_vsi *vsi)
u32 rx_page, rx_buf; u32 rx_page, rx_buf;
u64 rx_p, rx_b; u64 rx_p, rx_b;
u64 tx_p, tx_b; u64 tx_p, tx_b;
u32 val;
int i;
u16 q; u16 q;
if (test_bit(__I40E_DOWN, &vsi->state) || if (test_bit(__I40E_DOWN, &vsi->state) ||
...@@ -804,8 +801,8 @@ void i40e_update_stats(struct i40e_vsi *vsi) ...@@ -804,8 +801,8 @@ void i40e_update_stats(struct i40e_vsi *vsi)
ns->tx_packets = tx_p; ns->tx_packets = tx_p;
ns->tx_bytes = tx_b; ns->tx_bytes = tx_b;
i40e_update_eth_stats(vsi);
/* update netdev stats from eth stats */ /* update netdev stats from eth stats */
i40e_update_eth_stats(vsi);
ons->rx_errors = oes->rx_errors; ons->rx_errors = oes->rx_errors;
ns->rx_errors = es->rx_errors; ns->rx_errors = es->rx_errors;
ons->tx_errors = oes->tx_errors; ons->tx_errors = oes->tx_errors;
...@@ -815,184 +812,210 @@ void i40e_update_stats(struct i40e_vsi *vsi) ...@@ -815,184 +812,210 @@ void i40e_update_stats(struct i40e_vsi *vsi)
ons->tx_dropped = oes->tx_discards; ons->tx_dropped = oes->tx_discards;
ns->tx_dropped = es->tx_discards; ns->tx_dropped = es->tx_discards;
/* Get the port data only if this is the main PF VSI */ /* pull in a couple PF stats if this is the main vsi */
if (vsi == pf->vsi[pf->lan_vsi]) { if (vsi == pf->vsi[pf->lan_vsi]) {
struct i40e_hw_port_stats *nsd = &pf->stats; ns->rx_crc_errors = pf->stats.crc_errors;
struct i40e_hw_port_stats *osd = &pf->stats_offsets; ns->rx_errors = pf->stats.crc_errors + pf->stats.illegal_bytes;
ns->rx_length_errors = pf->stats.rx_length_errors;
i40e_stat_update48(hw, I40E_GLPRT_GORCH(hw->port), }
I40E_GLPRT_GORCL(hw->port), }
pf->stat_offsets_loaded,
&osd->eth.rx_bytes, &nsd->eth.rx_bytes);
i40e_stat_update48(hw, I40E_GLPRT_GOTCH(hw->port),
I40E_GLPRT_GOTCL(hw->port),
pf->stat_offsets_loaded,
&osd->eth.tx_bytes, &nsd->eth.tx_bytes);
i40e_stat_update32(hw, I40E_GLPRT_RDPC(hw->port),
pf->stat_offsets_loaded,
&osd->eth.rx_discards,
&nsd->eth.rx_discards);
i40e_stat_update32(hw, I40E_GLPRT_TDPC(hw->port),
pf->stat_offsets_loaded,
&osd->eth.tx_discards,
&nsd->eth.tx_discards);
i40e_stat_update48(hw, I40E_GLPRT_MPRCH(hw->port),
I40E_GLPRT_MPRCL(hw->port),
pf->stat_offsets_loaded,
&osd->eth.rx_multicast,
&nsd->eth.rx_multicast);
i40e_stat_update32(hw, I40E_GLPRT_TDOLD(hw->port), /**
pf->stat_offsets_loaded, * i40e_update_pf_stats - Update the pf statistics counters.
&osd->tx_dropped_link_down, * @pf: the PF to be updated
&nsd->tx_dropped_link_down); **/
static void i40e_update_pf_stats(struct i40e_pf *pf)
{
struct i40e_hw_port_stats *osd = &pf->stats_offsets;
struct i40e_hw_port_stats *nsd = &pf->stats;
struct i40e_hw *hw = &pf->hw;
u32 val;
int i;
i40e_stat_update32(hw, I40E_GLPRT_CRCERRS(hw->port), i40e_stat_update48(hw, I40E_GLPRT_GORCH(hw->port),
pf->stat_offsets_loaded, I40E_GLPRT_GORCL(hw->port),
&osd->crc_errors, &nsd->crc_errors); pf->stat_offsets_loaded,
ns->rx_crc_errors = nsd->crc_errors; &osd->eth.rx_bytes, &nsd->eth.rx_bytes);
i40e_stat_update48(hw, I40E_GLPRT_GOTCH(hw->port),
I40E_GLPRT_GOTCL(hw->port),
pf->stat_offsets_loaded,
&osd->eth.tx_bytes, &nsd->eth.tx_bytes);
i40e_stat_update32(hw, I40E_GLPRT_RDPC(hw->port),
pf->stat_offsets_loaded,
&osd->eth.rx_discards,
&nsd->eth.rx_discards);
i40e_stat_update32(hw, I40E_GLPRT_TDPC(hw->port),
pf->stat_offsets_loaded,
&osd->eth.tx_discards,
&nsd->eth.tx_discards);
i40e_stat_update48(hw, I40E_GLPRT_MPRCH(hw->port),
I40E_GLPRT_MPRCL(hw->port),
pf->stat_offsets_loaded,
&osd->eth.rx_multicast,
&nsd->eth.rx_multicast);
i40e_stat_update32(hw, I40E_GLPRT_ILLERRC(hw->port), i40e_stat_update32(hw, I40E_GLPRT_TDOLD(hw->port),
pf->stat_offsets_loaded, pf->stat_offsets_loaded,
&osd->illegal_bytes, &nsd->illegal_bytes); &osd->tx_dropped_link_down,
ns->rx_errors = nsd->crc_errors &nsd->tx_dropped_link_down);
+ nsd->illegal_bytes;
i40e_stat_update32(hw, I40E_GLPRT_MLFC(hw->port), i40e_stat_update32(hw, I40E_GLPRT_CRCERRS(hw->port),
pf->stat_offsets_loaded, pf->stat_offsets_loaded,
&osd->mac_local_faults, &osd->crc_errors, &nsd->crc_errors);
&nsd->mac_local_faults);
i40e_stat_update32(hw, I40E_GLPRT_MRFC(hw->port),
pf->stat_offsets_loaded,
&osd->mac_remote_faults,
&nsd->mac_remote_faults);
i40e_stat_update32(hw, I40E_GLPRT_RLEC(hw->port), i40e_stat_update32(hw, I40E_GLPRT_ILLERRC(hw->port),
pf->stat_offsets_loaded, pf->stat_offsets_loaded,
&osd->rx_length_errors, &osd->illegal_bytes, &nsd->illegal_bytes);
&nsd->rx_length_errors);
ns->rx_length_errors = nsd->rx_length_errors;
i40e_stat_update32(hw, I40E_GLPRT_LXONRXC(hw->port), i40e_stat_update32(hw, I40E_GLPRT_MLFC(hw->port),
pf->stat_offsets_loaded, pf->stat_offsets_loaded,
&osd->link_xon_rx, &nsd->link_xon_rx); &osd->mac_local_faults,
i40e_stat_update32(hw, I40E_GLPRT_LXONTXC(hw->port), &nsd->mac_local_faults);
pf->stat_offsets_loaded, i40e_stat_update32(hw, I40E_GLPRT_MRFC(hw->port),
&osd->link_xon_tx, &nsd->link_xon_tx); pf->stat_offsets_loaded,
i40e_update_prio_xoff_rx(pf); /* handles I40E_GLPRT_LXOFFRXC */ &osd->mac_remote_faults,
i40e_stat_update32(hw, I40E_GLPRT_LXOFFTXC(hw->port), &nsd->mac_remote_faults);
pf->stat_offsets_loaded,
&osd->link_xoff_tx, &nsd->link_xoff_tx);
for (i = 0; i < 8; i++) {
i40e_stat_update32(hw, I40E_GLPRT_PXONRXC(hw->port, i),
pf->stat_offsets_loaded,
&osd->priority_xon_rx[i],
&nsd->priority_xon_rx[i]);
i40e_stat_update32(hw, I40E_GLPRT_PXONTXC(hw->port, i),
pf->stat_offsets_loaded,
&osd->priority_xon_tx[i],
&nsd->priority_xon_tx[i]);
i40e_stat_update32(hw, I40E_GLPRT_PXOFFTXC(hw->port, i),
pf->stat_offsets_loaded,
&osd->priority_xoff_tx[i],
&nsd->priority_xoff_tx[i]);
i40e_stat_update32(hw,
I40E_GLPRT_RXON2OFFCNT(hw->port, i),
pf->stat_offsets_loaded,
&osd->priority_xon_2_xoff[i],
&nsd->priority_xon_2_xoff[i]);
}
i40e_stat_update48(hw, I40E_GLPRT_PRC64H(hw->port), i40e_stat_update32(hw, I40E_GLPRT_RLEC(hw->port),
I40E_GLPRT_PRC64L(hw->port), pf->stat_offsets_loaded,
pf->stat_offsets_loaded, &osd->rx_length_errors,
&osd->rx_size_64, &nsd->rx_size_64); &nsd->rx_length_errors);
i40e_stat_update48(hw, I40E_GLPRT_PRC127H(hw->port),
I40E_GLPRT_PRC127L(hw->port),
pf->stat_offsets_loaded,
&osd->rx_size_127, &nsd->rx_size_127);
i40e_stat_update48(hw, I40E_GLPRT_PRC255H(hw->port),
I40E_GLPRT_PRC255L(hw->port),
pf->stat_offsets_loaded,
&osd->rx_size_255, &nsd->rx_size_255);
i40e_stat_update48(hw, I40E_GLPRT_PRC511H(hw->port),
I40E_GLPRT_PRC511L(hw->port),
pf->stat_offsets_loaded,
&osd->rx_size_511, &nsd->rx_size_511);
i40e_stat_update48(hw, I40E_GLPRT_PRC1023H(hw->port),
I40E_GLPRT_PRC1023L(hw->port),
pf->stat_offsets_loaded,
&osd->rx_size_1023, &nsd->rx_size_1023);
i40e_stat_update48(hw, I40E_GLPRT_PRC1522H(hw->port),
I40E_GLPRT_PRC1522L(hw->port),
pf->stat_offsets_loaded,
&osd->rx_size_1522, &nsd->rx_size_1522);
i40e_stat_update48(hw, I40E_GLPRT_PRC9522H(hw->port),
I40E_GLPRT_PRC9522L(hw->port),
pf->stat_offsets_loaded,
&osd->rx_size_big, &nsd->rx_size_big);
i40e_stat_update48(hw, I40E_GLPRT_PTC64H(hw->port), i40e_stat_update32(hw, I40E_GLPRT_LXONRXC(hw->port),
I40E_GLPRT_PTC64L(hw->port), pf->stat_offsets_loaded,
pf->stat_offsets_loaded, &osd->link_xon_rx, &nsd->link_xon_rx);
&osd->tx_size_64, &nsd->tx_size_64); i40e_stat_update32(hw, I40E_GLPRT_LXONTXC(hw->port),
i40e_stat_update48(hw, I40E_GLPRT_PTC127H(hw->port), pf->stat_offsets_loaded,
I40E_GLPRT_PTC127L(hw->port), &osd->link_xon_tx, &nsd->link_xon_tx);
pf->stat_offsets_loaded, i40e_update_prio_xoff_rx(pf); /* handles I40E_GLPRT_LXOFFRXC */
&osd->tx_size_127, &nsd->tx_size_127); i40e_stat_update32(hw, I40E_GLPRT_LXOFFTXC(hw->port),
i40e_stat_update48(hw, I40E_GLPRT_PTC255H(hw->port), pf->stat_offsets_loaded,
I40E_GLPRT_PTC255L(hw->port), &osd->link_xoff_tx, &nsd->link_xoff_tx);
pf->stat_offsets_loaded,
&osd->tx_size_255, &nsd->tx_size_255);
i40e_stat_update48(hw, I40E_GLPRT_PTC511H(hw->port),
I40E_GLPRT_PTC511L(hw->port),
pf->stat_offsets_loaded,
&osd->tx_size_511, &nsd->tx_size_511);
i40e_stat_update48(hw, I40E_GLPRT_PTC1023H(hw->port),
I40E_GLPRT_PTC1023L(hw->port),
pf->stat_offsets_loaded,
&osd->tx_size_1023, &nsd->tx_size_1023);
i40e_stat_update48(hw, I40E_GLPRT_PTC1522H(hw->port),
I40E_GLPRT_PTC1522L(hw->port),
pf->stat_offsets_loaded,
&osd->tx_size_1522, &nsd->tx_size_1522);
i40e_stat_update48(hw, I40E_GLPRT_PTC9522H(hw->port),
I40E_GLPRT_PTC9522L(hw->port),
pf->stat_offsets_loaded,
&osd->tx_size_big, &nsd->tx_size_big);
i40e_stat_update32(hw, I40E_GLPRT_RUC(hw->port), for (i = 0; i < 8; i++) {
pf->stat_offsets_loaded, i40e_stat_update32(hw, I40E_GLPRT_PXONRXC(hw->port, i),
&osd->rx_undersize, &nsd->rx_undersize);
i40e_stat_update32(hw, I40E_GLPRT_RFC(hw->port),
pf->stat_offsets_loaded, pf->stat_offsets_loaded,
&osd->rx_fragments, &nsd->rx_fragments); &osd->priority_xon_rx[i],
i40e_stat_update32(hw, I40E_GLPRT_ROC(hw->port), &nsd->priority_xon_rx[i]);
i40e_stat_update32(hw, I40E_GLPRT_PXONTXC(hw->port, i),
pf->stat_offsets_loaded, pf->stat_offsets_loaded,
&osd->rx_oversize, &nsd->rx_oversize); &osd->priority_xon_tx[i],
i40e_stat_update32(hw, I40E_GLPRT_RJC(hw->port), &nsd->priority_xon_tx[i]);
i40e_stat_update32(hw, I40E_GLPRT_PXOFFTXC(hw->port, i),
pf->stat_offsets_loaded, pf->stat_offsets_loaded,
&osd->rx_jabber, &nsd->rx_jabber); &osd->priority_xoff_tx[i],
&nsd->priority_xoff_tx[i]);
val = rd32(hw, I40E_PRTPM_EEE_STAT); i40e_stat_update32(hw,
nsd->tx_lpi_status = I40E_GLPRT_RXON2OFFCNT(hw->port, i),
(val & I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_MASK) >>
I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_SHIFT;
nsd->rx_lpi_status =
(val & I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_MASK) >>
I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_SHIFT;
i40e_stat_update32(hw, I40E_PRTPM_TLPIC,
pf->stat_offsets_loaded, pf->stat_offsets_loaded,
&osd->tx_lpi_count, &nsd->tx_lpi_count); &osd->priority_xon_2_xoff[i],
i40e_stat_update32(hw, I40E_PRTPM_RLPIC, &nsd->priority_xon_2_xoff[i]);
pf->stat_offsets_loaded,
&osd->rx_lpi_count, &nsd->rx_lpi_count);
} }
i40e_stat_update48(hw, I40E_GLPRT_PRC64H(hw->port),
I40E_GLPRT_PRC64L(hw->port),
pf->stat_offsets_loaded,
&osd->rx_size_64, &nsd->rx_size_64);
i40e_stat_update48(hw, I40E_GLPRT_PRC127H(hw->port),
I40E_GLPRT_PRC127L(hw->port),
pf->stat_offsets_loaded,
&osd->rx_size_127, &nsd->rx_size_127);
i40e_stat_update48(hw, I40E_GLPRT_PRC255H(hw->port),
I40E_GLPRT_PRC255L(hw->port),
pf->stat_offsets_loaded,
&osd->rx_size_255, &nsd->rx_size_255);
i40e_stat_update48(hw, I40E_GLPRT_PRC511H(hw->port),
I40E_GLPRT_PRC511L(hw->port),
pf->stat_offsets_loaded,
&osd->rx_size_511, &nsd->rx_size_511);
i40e_stat_update48(hw, I40E_GLPRT_PRC1023H(hw->port),
I40E_GLPRT_PRC1023L(hw->port),
pf->stat_offsets_loaded,
&osd->rx_size_1023, &nsd->rx_size_1023);
i40e_stat_update48(hw, I40E_GLPRT_PRC1522H(hw->port),
I40E_GLPRT_PRC1522L(hw->port),
pf->stat_offsets_loaded,
&osd->rx_size_1522, &nsd->rx_size_1522);
i40e_stat_update48(hw, I40E_GLPRT_PRC9522H(hw->port),
I40E_GLPRT_PRC9522L(hw->port),
pf->stat_offsets_loaded,
&osd->rx_size_big, &nsd->rx_size_big);
i40e_stat_update48(hw, I40E_GLPRT_PTC64H(hw->port),
I40E_GLPRT_PTC64L(hw->port),
pf->stat_offsets_loaded,
&osd->tx_size_64, &nsd->tx_size_64);
i40e_stat_update48(hw, I40E_GLPRT_PTC127H(hw->port),
I40E_GLPRT_PTC127L(hw->port),
pf->stat_offsets_loaded,
&osd->tx_size_127, &nsd->tx_size_127);
i40e_stat_update48(hw, I40E_GLPRT_PTC255H(hw->port),
I40E_GLPRT_PTC255L(hw->port),
pf->stat_offsets_loaded,
&osd->tx_size_255, &nsd->tx_size_255);
i40e_stat_update48(hw, I40E_GLPRT_PTC511H(hw->port),
I40E_GLPRT_PTC511L(hw->port),
pf->stat_offsets_loaded,
&osd->tx_size_511, &nsd->tx_size_511);
i40e_stat_update48(hw, I40E_GLPRT_PTC1023H(hw->port),
I40E_GLPRT_PTC1023L(hw->port),
pf->stat_offsets_loaded,
&osd->tx_size_1023, &nsd->tx_size_1023);
i40e_stat_update48(hw, I40E_GLPRT_PTC1522H(hw->port),
I40E_GLPRT_PTC1522L(hw->port),
pf->stat_offsets_loaded,
&osd->tx_size_1522, &nsd->tx_size_1522);
i40e_stat_update48(hw, I40E_GLPRT_PTC9522H(hw->port),
I40E_GLPRT_PTC9522L(hw->port),
pf->stat_offsets_loaded,
&osd->tx_size_big, &nsd->tx_size_big);
i40e_stat_update32(hw, I40E_GLPRT_RUC(hw->port),
pf->stat_offsets_loaded,
&osd->rx_undersize, &nsd->rx_undersize);
i40e_stat_update32(hw, I40E_GLPRT_RFC(hw->port),
pf->stat_offsets_loaded,
&osd->rx_fragments, &nsd->rx_fragments);
i40e_stat_update32(hw, I40E_GLPRT_ROC(hw->port),
pf->stat_offsets_loaded,
&osd->rx_oversize, &nsd->rx_oversize);
i40e_stat_update32(hw, I40E_GLPRT_RJC(hw->port),
pf->stat_offsets_loaded,
&osd->rx_jabber, &nsd->rx_jabber);
val = rd32(hw, I40E_PRTPM_EEE_STAT);
nsd->tx_lpi_status =
(val & I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_MASK) >>
I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_SHIFT;
nsd->rx_lpi_status =
(val & I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_MASK) >>
I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_SHIFT;
i40e_stat_update32(hw, I40E_PRTPM_TLPIC,
pf->stat_offsets_loaded,
&osd->tx_lpi_count, &nsd->tx_lpi_count);
i40e_stat_update32(hw, I40E_PRTPM_RLPIC,
pf->stat_offsets_loaded,
&osd->rx_lpi_count, &nsd->rx_lpi_count);
pf->stat_offsets_loaded = true; pf->stat_offsets_loaded = true;
} }
/**
* i40e_update_stats - Update the various statistics counters.
* @vsi: the VSI to be updated
*
* Update the various stats for this VSI and its related entities.
**/
void i40e_update_stats(struct i40e_vsi *vsi)
{
struct i40e_pf *pf = vsi->back;
if (vsi == pf->vsi[pf->lan_vsi])
i40e_update_pf_stats(pf);
i40e_update_vsi_stats(vsi);
}
/** /**
* i40e_find_filter - Search VSI filter list for specific mac/vlan filter * i40e_find_filter - Search VSI filter list for specific mac/vlan filter
* @vsi: the VSI to be searched * @vsi: the VSI to be searched
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册