From patchwork Thu Jul 22 09:54:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 96203 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5D417A0C4E; Thu, 22 Jul 2021 11:55:29 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 93EB341136; Thu, 22 Jul 2021 11:55:12 +0200 (CEST) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id CEF43410DD; Thu, 22 Jul 2021 11:55:10 +0200 (CEST) Received: by shelob.oktetlabs.ru (Postfix, from userid 122) id 9C3AF7F6D6; Thu, 22 Jul 2021 12:55:10 +0300 (MSK) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shelob.oktetlabs.ru X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=ALL_TRUSTED, DKIM_ADSP_DISCARD, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from aros.oktetlabs.ru (aros.oktetlabs.ru [192.168.38.17]) by shelob.oktetlabs.ru (Postfix) with ESMTP id 8547A7F6C9; Thu, 22 Jul 2021 12:54:45 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 8547A7F6C9 Authentication-Results: shelob.oktetlabs.ru/8547A7F6C9; dkim=none; dkim-atps=neutral From: Andrew Rybchenko To: dev@dpdk.org, Remy Horton , Ivan Malov Cc: David Marchand , Ivan Ilchenko , stable@dpdk.org, Andy Moreton Date: Thu, 22 Jul 2021 12:54:28 +0300 Message-Id: <20210722095433.1898589-7-andrew.rybchenko@oktetlabs.ru> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210722095433.1898589-1-andrew.rybchenko@oktetlabs.ru> References: <20210604144225.287678-1-andrew.rybchenko@oktetlabs.ru> <20210722095433.1898589-1-andrew.rybchenko@oktetlabs.ru> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 06/11] net/sfc: fix accessing xstats by an unsorted list of IDs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Ilchenko Device may support only some MAC stats. Add mapping from ids to subset of supported MAC stats for each port. Fixes: 73280c1e4ff ("net/sfc: support xstats retrieval by ID") Cc: stable@dpdk.org Signed-off-by: Ivan Ilchenko Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/sfc.h | 2 ++ drivers/net/sfc/sfc_ethdev.c | 44 ++++++++++++++++++------------------ drivers/net/sfc/sfc_port.c | 29 ++++++++++++++++++------ 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h index c7b0e5a30d..972d32606d 100644 --- a/drivers/net/sfc/sfc.h +++ b/drivers/net/sfc/sfc.h @@ -141,6 +141,8 @@ struct sfc_port { uint32_t mac_stats_mask[EFX_MAC_STATS_MASK_NPAGES]; + unsigned int mac_stats_by_id[EFX_MAC_NSTATS]; + uint64_t ipackets; }; diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index fca3f524a1..ae9304f90f 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -788,8 +788,6 @@ sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids, struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev); 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; @@ -808,17 +806,19 @@ sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids, 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[nb_written] == nb_supported) - values[nb_written++] = mac_stats[i]; + SFC_ASSERT(port->mac_stats_nb_supported <= + RTE_DIM(port->mac_stats_by_id)); - ++nb_supported; + for (i = 0; i < n; i++) { + if (ids[i] < port->mac_stats_nb_supported) { + values[i] = mac_stats[port->mac_stats_by_id[ids[i]]]; + } else { + ret = i; + goto unlock; + } } - ret = nb_written; + ret = n; unlock: sfc_adapter_unlock(sa); @@ -833,8 +833,7 @@ sfc_xstats_get_names_by_id(struct rte_eth_dev *dev, { struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev); struct sfc_port *port = &sa->port; - unsigned int nb_supported = 0; - unsigned int nb_written = 0; + unsigned int nb_supported; unsigned int i; if (unlikely(xstats_names == NULL && ids != NULL) || @@ -849,23 +848,24 @@ sfc_xstats_get_names_by_id(struct rte_eth_dev *dev, return 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[nb_written] == nb_supported) { - char *name = xstats_names[nb_written++].name; + SFC_ASSERT(port->mac_stats_nb_supported <= + RTE_DIM(port->mac_stats_by_id)); - strlcpy(name, efx_mac_stat_name(sa->nic, i), + for (i = 0; i < size; i++) { + if (ids[i] < port->mac_stats_nb_supported) { + strlcpy(xstats_names[i].name, + efx_mac_stat_name(sa->nic, + port->mac_stats_by_id[ids[i]]), sizeof(xstats_names[0].name)); + } else { + sfc_adapter_unlock(sa); + return i; } - - ++nb_supported; } sfc_adapter_unlock(sa); - return nb_written; + return size; } static int diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c index cdc0f94f19..bb9e01d96b 100644 --- a/drivers/net/sfc/sfc_port.c +++ b/drivers/net/sfc/sfc_port.c @@ -157,6 +157,27 @@ sfc_port_phy_caps_to_max_link_speed(uint32_t phy_caps) #endif +static void +sfc_port_fill_mac_stats_info(struct sfc_adapter *sa) +{ + unsigned int mac_stats_nb_supported = 0; + struct sfc_port *port = &sa->port; + unsigned int stat_idx; + + efx_mac_stats_get_mask(sa->nic, port->mac_stats_mask, + sizeof(port->mac_stats_mask)); + + for (stat_idx = 0; stat_idx < EFX_MAC_NSTATS; ++stat_idx) { + if (!EFX_MAC_STAT_SUPPORTED(port->mac_stats_mask, stat_idx)) + continue; + + port->mac_stats_by_id[mac_stats_nb_supported] = stat_idx; + mac_stats_nb_supported++; + } + + port->mac_stats_nb_supported = mac_stats_nb_supported; +} + int sfc_port_start(struct sfc_adapter *sa) { @@ -165,7 +186,6 @@ 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"); @@ -259,12 +279,7 @@ sfc_port_start(struct sfc_adapter *sa) port->mac_stats_reset_pending = B_FALSE; } - 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++; + sfc_port_fill_mac_stats_info(sa); port->mac_stats_update_generation = 0;