[dpdk-stable] patch 'net/sfc: fix Rx packets counter' has been queued to LTS release 17.11.6
Yongseok Koh
yskoh at mellanox.com
Fri Mar 8 18:47:34 CET 2019
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 <arybchenko at solarflare.com>
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 <arybchenko at solarflare.com>
---
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 <arybchenko at solarflare.com>
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 at dpdk.org
Signed-off-by: Andrew Rybchenko <arybchenko at solarflare.com>
---
@@ -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);
More information about the stable
mailing list