From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id B1D3C2B87 for ; Fri, 8 Mar 2019 18:49:27 +0100 (CET) Received: from Internal Mail-Server by MTLPINE1 (envelope-from yskoh@mellanox.com) with ESMTPS (AES256-SHA encrypted); 8 Mar 2019 19:49:24 +0200 Received: from scfae-sc-2.mti.labs.mlnx (scfae-sc-2.mti.labs.mlnx [10.101.0.96]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x28HloBC002625; Fri, 8 Mar 2019 19:49:23 +0200 From: Yongseok Koh To: Andrew Rybchenko Cc: dpdk stable Date: Fri, 8 Mar 2019 09:47:34 -0800 Message-Id: <20190308174749.30771-56-yskoh@mellanox.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190308174749.30771-1-yskoh@mellanox.com> References: <20190308174749.30771-1-yskoh@mellanox.com> Subject: [dpdk-stable] patch 'net/sfc: fix Rx packets counter' has been queued to LTS release 17.11.6 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 08 Mar 2019 17:49:28 -0000 Hi, FYI, your patch has been queued to LTS release 17.11.6 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objection by 03/13/19. So please shout if anyone has objection. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. If the code is different (ie: not only metadata diffs), due for example to a change in context or macro names, please double check it. Thanks. Yongseok --- >>From 10498b42efd1f989bbf211dab69de474d4f68169 Mon Sep 17 00:00:00 2001 From: Andrew Rybchenko Date: Thu, 17 Jan 2019 06:17:32 +0000 Subject: [PATCH] net/sfc: fix Rx packets counter [ upstream commit ab77a0013a811aacdde49e903786eff7abb308ec ] Errors, missed and pauses should not be included in delivered good Rx packets reported by ipackets. Fixes: 1caab2f1e684 ("net/sfc: add basic statistics") Signed-off-by: Andrew Rybchenko --- drivers/net/sfc/sfc.h | 2 ++ drivers/net/sfc/sfc_ethdev.c | 31 ++++++++++++++++++++++++++++++- drivers/net/sfc/sfc_port.c | 14 ++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h index 7bc7a077c..b62306512 100644 --- a/drivers/net/sfc/sfc.h +++ b/drivers/net/sfc/sfc.h @@ -175,6 +175,8 @@ struct sfc_port { uint64_t mac_stats_last_request_timestamp; uint32_t mac_stats_mask[EFX_MAC_STATS_MASK_NPAGES]; + + uint64_t ipackets; }; /* Adapter private data */ diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index 5854fd76a..09ab4ec8a 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -518,6 +518,29 @@ sfc_tx_queue_release(void *queue) sfc_adapter_unlock(sa); } +/* + * Some statistics are computed as A - B where A and B each increase + * monotonically with some hardware counter(s) and the counters are read + * asynchronously. + * + * If packet X is counted in A, but not counted in B yet, computed value is + * greater than real. + * + * If packet X is not counted in A at the moment of reading the counter, + * but counted in B at the moment of reading the counter, computed value + * is less than real. + * + * However, counter which grows backward is worse evil than slightly wrong + * value. So, let's try to guarantee that it never happens except may be + * the case when the MAC stats are zeroed as a result of a NIC reset. + */ +static void +sfc_update_diff_stat(uint64_t *stat, uint64_t newval) +{ + if ((int64_t)(newval - *stat) > 0 || newval == 0) + *stat = newval; +} + static int sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) { @@ -555,7 +578,6 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) stats->imissed = mac_stats[EFX_MAC_VADAPTER_RX_BAD_PACKETS]; stats->oerrors = mac_stats[EFX_MAC_VADAPTER_TX_BAD_PACKETS]; } else { - stats->ipackets = mac_stats[EFX_MAC_RX_PKTS]; stats->opackets = mac_stats[EFX_MAC_TX_PKTS]; stats->ibytes = mac_stats[EFX_MAC_RX_OCTETS]; stats->obytes = mac_stats[EFX_MAC_TX_OCTETS]; @@ -581,6 +603,13 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) mac_stats[EFX_MAC_RX_ALIGN_ERRORS] + mac_stats[EFX_MAC_RX_JABBER_PKTS]; /* no oerrors counters supported on EF10 */ + + /* Exclude missed, errors and pauses from Rx packets */ + sfc_update_diff_stat(&port->ipackets, + mac_stats[EFX_MAC_RX_PKTS] - + mac_stats[EFX_MAC_RX_PAUSE_PKTS] - + stats->imissed - stats->ierrors); + stats->ipackets = port->ipackets; } unlock: diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c index 5254394c9..109981f13 100644 --- a/drivers/net/sfc/sfc_port.c +++ b/drivers/net/sfc/sfc_port.c @@ -109,6 +109,18 @@ sfc_port_update_mac_stats(struct sfc_adapter *sa) return 0; } +static void +sfc_port_reset_sw_stats(struct sfc_adapter *sa) +{ + struct sfc_port *port = &sa->port; + + /* + * Reset diff stats explicitly since check which does not allow + * the statistics to grow backward could deny it. + */ + port->ipackets = 0; +} + int sfc_port_reset_mac_stats(struct sfc_adapter *sa) { @@ -117,6 +129,8 @@ sfc_port_reset_mac_stats(struct sfc_adapter *sa) rte_spinlock_lock(&port->mac_stats_lock); rc = efx_mac_stats_clear(sa->nic); + if (rc == 0) + sfc_port_reset_sw_stats(sa); rte_spinlock_unlock(&port->mac_stats_lock); return rc; -- 2.11.0 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2019-03-08 09:46:42.973675250 -0800 +++ 0056-net-sfc-fix-Rx-packets-counter.patch 2019-03-08 09:46:40.295402000 -0800 @@ -1,13 +1,14 @@ -From ab77a0013a811aacdde49e903786eff7abb308ec Mon Sep 17 00:00:00 2001 +From 10498b42efd1f989bbf211dab69de474d4f68169 Mon Sep 17 00:00:00 2001 From: Andrew Rybchenko Date: Thu, 17 Jan 2019 06:17:32 +0000 Subject: [PATCH] net/sfc: fix Rx packets counter +[ upstream commit ab77a0013a811aacdde49e903786eff7abb308ec ] + Errors, missed and pauses should not be included in delivered good Rx packets reported by ipackets. Fixes: 1caab2f1e684 ("net/sfc: add basic statistics") -Cc: stable@dpdk.org Signed-off-by: Andrew Rybchenko --- @@ -17,10 +18,10 @@ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h -index 0b852340f..a94ca8e75 100644 +index 7bc7a077c..b62306512 100644 --- a/drivers/net/sfc/sfc.h +++ b/drivers/net/sfc/sfc.h -@@ -149,6 +149,8 @@ struct sfc_port { +@@ -175,6 +175,8 @@ struct sfc_port { uint64_t mac_stats_last_request_timestamp; uint32_t mac_stats_mask[EFX_MAC_STATS_MASK_NPAGES]; @@ -28,12 +29,12 @@ + uint64_t ipackets; }; - struct sfc_rss_hf_rte_to_efx { + /* Adapter private data */ diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c -index 08d3271cb..a7322a1eb 100644 +index 5854fd76a..09ab4ec8a 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c -@@ -503,6 +503,29 @@ sfc_tx_queue_release(void *queue) +@@ -518,6 +518,29 @@ sfc_tx_queue_release(void *queue) sfc_adapter_unlock(sa); } @@ -63,7 +64,7 @@ static int sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) { -@@ -540,7 +563,6 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) +@@ -555,7 +578,6 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) stats->imissed = mac_stats[EFX_MAC_VADAPTER_RX_BAD_PACKETS]; stats->oerrors = mac_stats[EFX_MAC_VADAPTER_TX_BAD_PACKETS]; } else { @@ -71,7 +72,7 @@ stats->opackets = mac_stats[EFX_MAC_TX_PKTS]; stats->ibytes = mac_stats[EFX_MAC_RX_OCTETS]; stats->obytes = mac_stats[EFX_MAC_TX_OCTETS]; -@@ -566,6 +588,13 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) +@@ -581,6 +603,13 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) mac_stats[EFX_MAC_RX_ALIGN_ERRORS] + mac_stats[EFX_MAC_RX_JABBER_PKTS]; /* no oerrors counters supported on EF10 */ @@ -86,10 +87,10 @@ unlock: diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c -index 5384dbbdb..5eb4b3aca 100644 +index 5254394c9..109981f13 100644 --- a/drivers/net/sfc/sfc_port.c +++ b/drivers/net/sfc/sfc_port.c -@@ -87,6 +87,18 @@ sfc_port_update_mac_stats(struct sfc_adapter *sa) +@@ -109,6 +109,18 @@ sfc_port_update_mac_stats(struct sfc_adapter *sa) return 0; } @@ -108,7 +109,7 @@ int sfc_port_reset_mac_stats(struct sfc_adapter *sa) { -@@ -95,6 +107,8 @@ sfc_port_reset_mac_stats(struct sfc_adapter *sa) +@@ -117,6 +129,8 @@ sfc_port_reset_mac_stats(struct sfc_adapter *sa) rte_spinlock_lock(&port->mac_stats_lock); rc = efx_mac_stats_clear(sa->nic);