* [dpdk-dev] [PATCH] net/sfc: add support for xstats retrieval by ID
@ 2017-07-08 15:45 Andrew Rybchenko
2017-07-12 14:18 ` Remy Horton
0 siblings, 1 reply; 4+ messages in thread
From: Andrew Rybchenko @ 2017-07-08 15:45 UTC (permalink / raw)
To: dev; +Cc: Ivan Malov
From: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
drivers/net/sfc/sfc.h | 1 +
drivers/net/sfc/sfc_ethdev.c | 81 ++++++++++++++++++++++++++++++++++++++++++++
drivers/net/sfc/sfc_port.c | 5 +++
3 files changed, 87 insertions(+)
diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index d287413..6d2a6e5 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -164,6 +164,7 @@ struct sfc_port {
rte_spinlock_t mac_stats_lock;
uint64_t *mac_stats_buf;
+ unsigned int mac_stats_nb_supported;
efsys_mem_t mac_stats_dma_mem;
boolean_t mac_stats_reset_pending;
uint16_t mac_stats_update_period_ms;
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 6b06f08..12bcd6f 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -666,6 +666,85 @@ sfc_xstats_get_names(struct rte_eth_dev *dev,
}
static int
+sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
+ uint64_t *values, unsigned int n)
+{
+ struct sfc_adapter *sa = dev->data->dev_private;
+ struct sfc_port *port = &sa->port;
+ uint64_t *mac_stats;
+ unsigned int nb_supported = 0;
+ unsigned int nb_written = 0;
+ unsigned int i;
+ int ret;
+ int rc;
+
+ if (unlikely(values == NULL) ||
+ unlikely((ids == NULL) && (n < port->mac_stats_nb_supported)))
+ return port->mac_stats_nb_supported;
+
+ rte_spinlock_lock(&port->mac_stats_lock);
+
+ rc = sfc_port_update_mac_stats(sa);
+ if (rc != 0) {
+ SFC_ASSERT(rc > 0);
+ ret = -rc;
+ goto unlock;
+ }
+
+ mac_stats = port->mac_stats_buf;
+
+ for (i = 0; (i < EFX_MAC_NSTATS) && (nb_written < n); ++i) {
+ if (!EFX_MAC_STAT_SUPPORTED(port->mac_stats_mask, i))
+ continue;
+
+ if ((ids == NULL) || (ids[nb_written] == nb_supported))
+ values[nb_written++] = mac_stats[i];
+
+ ++nb_supported;
+ }
+
+ ret = nb_written;
+
+unlock:
+ rte_spinlock_unlock(&port->mac_stats_lock);
+
+ return ret;
+}
+
+static int
+sfc_xstats_get_names_by_id(struct rte_eth_dev *dev,
+ struct rte_eth_xstat_name *xstats_names,
+ const uint64_t *ids, unsigned int size)
+{
+ struct sfc_adapter *sa = dev->data->dev_private;
+ struct sfc_port *port = &sa->port;
+ unsigned int nb_supported = 0;
+ unsigned int nb_written = 0;
+ unsigned int i;
+
+ if (unlikely(xstats_names == NULL) ||
+ unlikely((ids == NULL) && (size < port->mac_stats_nb_supported)))
+ return port->mac_stats_nb_supported;
+
+ for (i = 0; (i < EFX_MAC_NSTATS) && (nb_written < size); ++i) {
+ if (!EFX_MAC_STAT_SUPPORTED(port->mac_stats_mask, i))
+ continue;
+
+ if ((ids == NULL) || (ids[nb_written] == nb_supported)) {
+ char *name = xstats_names[nb_written++].name;
+
+ strncpy(name, efx_mac_stat_name(sa->nic, i),
+ sizeof(xstats_names[0].name));
+ name[sizeof(xstats_names[0].name) - 1] = '\0';
+ }
+
+ ++nb_supported;
+ }
+
+ return nb_written;
+}
+
+static int
sfc_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
{
struct sfc_adapter *sa = dev->data->dev_private;
@@ -1406,6 +1485,8 @@ static const struct eth_dev_ops sfc_eth_dev_ops = {
.rxq_info_get = sfc_rx_queue_info_get,
.txq_info_get = sfc_tx_queue_info_get,
.fw_version_get = sfc_fw_version_get,
+ .xstats_get_by_id = sfc_xstats_get_by_id,
+ .xstats_get_names_by_id = sfc_xstats_get_names_by_id,
};
/**
diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c
index e7eea9f..5bd7fad 100644
--- a/drivers/net/sfc/sfc_port.c
+++ b/drivers/net/sfc/sfc_port.c
@@ -151,6 +151,7 @@ sfc_port_start(struct sfc_adapter *sa)
uint32_t phy_adv_cap;
const uint32_t phy_pause_caps =
((1u << EFX_PHY_CAP_PAUSE) | (1u << EFX_PHY_CAP_ASYM));
+ unsigned int i;
sfc_log_init(sa, "entry");
@@ -222,6 +223,10 @@ sfc_port_start(struct sfc_adapter *sa)
efx_mac_stats_get_mask(sa->nic, port->mac_stats_mask,
sizeof(port->mac_stats_mask));
+ for (i = 0, port->mac_stats_nb_supported = 0; i < EFX_MAC_NSTATS; ++i)
+ if (EFX_MAC_STAT_SUPPORTED(port->mac_stats_mask, i))
+ port->mac_stats_nb_supported++;
+
port->mac_stats_update_generation = 0;
if (port->mac_stats_update_period_ms != 0) {
--
2.7.4
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [dpdk-dev] [PATCH] net/sfc: add support for xstats retrieval by ID
2017-07-08 15:45 [dpdk-dev] [PATCH] net/sfc: add support for xstats retrieval by ID Andrew Rybchenko
@ 2017-07-12 14:18 ` Remy Horton
2017-07-12 14:36 ` Andrew Rybchenko
2017-07-18 8:33 ` Ferruh Yigit
0 siblings, 2 replies; 4+ messages in thread
From: Remy Horton @ 2017-07-12 14:18 UTC (permalink / raw)
To: Andrew Rybchenko, dev; +Cc: Ivan Malov
On 08/07/2017 16:45, Andrew Rybchenko wrote:
> From: Ivan Malov <ivan.malov@oktetlabs.ru>
>
> Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
[..]
Reviewed-by: Remy Horton <remy.horton@intel.com>
> + rc = sfc_port_update_mac_stats(sa);
> + if (rc != 0) {
> + SFC_ASSERT(rc > 0);
> + ret = -rc;
sfc_port_update_mac_stats() really ought to be returning -EINVAL or
-ENOMEM rather than EINVAL/ENOMEM then doing a negation here.
Other than that, code seems OK..
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [dpdk-dev] [PATCH] net/sfc: add support for xstats retrieval by ID
2017-07-12 14:18 ` Remy Horton
@ 2017-07-12 14:36 ` Andrew Rybchenko
2017-07-18 8:33 ` Ferruh Yigit
1 sibling, 0 replies; 4+ messages in thread
From: Andrew Rybchenko @ 2017-07-12 14:36 UTC (permalink / raw)
To: Remy Horton, dev; +Cc: Ivan Malov
On 07/12/2017 05:18 PM, Remy Horton wrote:
>
> On 08/07/2017 16:45, Andrew Rybchenko wrote:
>> From: Ivan Malov <ivan.malov@oktetlabs.ru>
>>
>> Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
>> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
> [..]
>
> Reviewed-by: Remy Horton <remy.horton@intel.com>
>
>
>> + rc = sfc_port_update_mac_stats(sa);
>> + if (rc != 0) {
>> + SFC_ASSERT(rc > 0);
>> + ret = -rc;
>
> sfc_port_update_mac_stats() really ought to be returning -EINVAL or
> -ENOMEM rather than EINVAL/ENOMEM then doing a negation here.
It is the decision made on driver implementation to convert to negative
errno
at rte_eth_dev_ops return.
Inside the driver we use positive errno since base driver uses positive
errno and
a number of places where base driver API is called (and conversion would
be required)
is significantly bigger than a number of rte_eth_dev_ops.
> Other than that, code seems OK..
Many thanks for the review.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [dpdk-dev] [PATCH] net/sfc: add support for xstats retrieval by ID
2017-07-12 14:18 ` Remy Horton
2017-07-12 14:36 ` Andrew Rybchenko
@ 2017-07-18 8:33 ` Ferruh Yigit
1 sibling, 0 replies; 4+ messages in thread
From: Ferruh Yigit @ 2017-07-18 8:33 UTC (permalink / raw)
To: Remy Horton, Andrew Rybchenko, dev; +Cc: Ivan Malov
On 7/12/2017 3:18 PM, Remy Horton wrote:
>
> On 08/07/2017 16:45, Andrew Rybchenko wrote:
>> From: Ivan Malov <ivan.malov@oktetlabs.ru>
>>
>> Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
>> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
> [..]
>
> Reviewed-by: Remy Horton <remy.horton@intel.com>
Applied to dpdk-next-net/master, thanks.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-07-18 8:33 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-08 15:45 [dpdk-dev] [PATCH] net/sfc: add support for xstats retrieval by ID Andrew Rybchenko
2017-07-12 14:18 ` Remy Horton
2017-07-12 14:36 ` Andrew Rybchenko
2017-07-18 8:33 ` Ferruh Yigit
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).