From patchwork Tue Feb 22 16:06:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Krawczyk X-Patchwork-Id: 107990 X-Patchwork-Delegate: ferruh.yigit@amd.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 57236A0352; Tue, 22 Feb 2022 17:08:31 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id ED543411E6; Tue, 22 Feb 2022 17:07:13 +0100 (CET) Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) by mails.dpdk.org (Postfix) with ESMTP id 92D3F411AE for ; Tue, 22 Feb 2022 17:07:10 +0100 (CET) Received: by mail-ej1-f54.google.com with SMTP id qx21so44284723ejb.13 for ; Tue, 22 Feb 2022 08:07:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=HexrzqMhOSZQMQXdYhbCJ6UgcGMV1Vcs7Dsbc7kZMJQ=; b=TzfRPlzju06SMg+lH3C8lmRVOTSpypPjlfjVZX4kkxczzUVjOcNFHyl6qEnnITyyX8 svXdJR2azav8ImEJPtzP8Hk2ZdzvRh5QDiZRfJD0oZz4KJrYYJar9/ST0QzXEZZon9lb sBVQ0sk14uarjFJJk8p0Av80Vmc1+kyt7Hn2Z0TbEv9ZTrZZ/c3K5X1hTEuMipRM0780 vlJWY4Wi4zEqg2RQ9gd5QdTxFazhhzFEZmcnyf5hp1LPJuknRrkI7os3SEeY5I/duLOH nyLfXnerwFHIh7cOoWyM9GFwNRg+wszvGivtrIzSP6cHVJNOu5RuQEnmii0Tl7juO6rd NRug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HexrzqMhOSZQMQXdYhbCJ6UgcGMV1Vcs7Dsbc7kZMJQ=; b=e7AWMWdvRM/JV2BRQLHGF/hhWYYJIgwzUvSCbXHIKeyYg+1Yu6K6V5TC9D1fYhdT1X ZT1wmmtOkwZG1euWPoxeqd8lq7irFhXhm6bIn2sSuZwfQcR+j3T7SGMc/wfcj5uCNHej WamC9slcEeHcJIIQpiW/CxBEiIzO7th9usiTqQQyGw/Ym4GWVpvTmVSaXQ1WB4cLK2R9 T1Q1lauQEsxmi7JYCz+8ueSMOJFmmqXu+Anu8bFOSqdmaInCwSQU48Pf5Ngc4HiW0QPJ YbkyYGjAiKYwWCWlCTWgf+yDPJzW2WQ2Ad6CE6ojID9e08xqYAePTTI0rMEkvajmPS/f DBFA== X-Gm-Message-State: AOAM532VHOWaeJu6zuXVPXD4QdmE+yimcACwdl1JYhd6Xnk/yDjN/KmT HHXCQ5OOm8K6S3Rpbl09+31hUNEpjqUvzQ== X-Google-Smtp-Source: ABdhPJxFdvrIdl5AFVhbRmtbrXJX6dW5y3YnLnvERrXq+JH6EtMB7M4vQnj8VLO83VQ+LT8v+DUUmg== X-Received: by 2002:a17:907:2bf6:b0:6b9:725e:4e1f with SMTP id gv54-20020a1709072bf600b006b9725e4e1fmr19899566ejc.527.1645546029993; Tue, 22 Feb 2022 08:07:09 -0800 (PST) Received: from DESKTOP-U5LNN3J.localdomain (89-79-181-52.dynamic.chello.pl. [89.79.181.52]) by smtp.gmail.com with ESMTPSA id x6sm10013477edv.109.2022.02.22.08.07.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 22 Feb 2022 08:07:09 -0800 (PST) From: Michal Krawczyk To: dev@dpdk.org Cc: shaibran@amazon.com, upstream@semihalf.com, Michal Krawczyk , Dawid Gorecki Subject: [PATCH 14/21] net/ena: add API for probing xstat names by ID Date: Tue, 22 Feb 2022 17:06:27 +0100 Message-Id: <20220222160634.24489-15-mk@semihalf.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220222160634.24489-1-mk@semihalf.com> References: <20220222160634.24489-1-mk@semihalf.com> MIME-Version: 1.0 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 ENA was only supporting retrieval of all the xstats name and wasn't implementing the eth_xstats_get_names_by_id API. As this API may be more efficient than retrieving all the names, it tries to avoid excessive string copying. Signed-off-by: Michal Krawczyk Reviewed-by: Dawid Gorecki Reviewed-by: Shai Brandes --- doc/guides/rel_notes/release_22_03.rst | 1 + drivers/net/ena/ena_ethdev.c | 130 ++++++++++++++++++++----- 2 files changed, 108 insertions(+), 23 deletions(-) diff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst index 91324dae18..1b87b9c174 100644 --- a/doc/guides/rel_notes/release_22_03.rst +++ b/doc/guides/rel_notes/release_22_03.rst @@ -115,6 +115,7 @@ New Features * Added optimized memcpy support for the ARM platforms. * Added ENA admin queue support for the MP applications. * Added free Tx mbuf on demand feature support. + * Added ``rte_eth_xstats_get_names_by_id`` API support. * **Updated Cisco enic driver.** diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c index eecdd447dd..0766f613b0 100644 --- a/drivers/net/ena/ena_ethdev.c +++ b/drivers/net/ena/ena_ethdev.c @@ -230,6 +230,10 @@ static int eth_ena_dev_init(struct rte_eth_dev *eth_dev); static int ena_xstats_get_names(struct rte_eth_dev *dev, struct rte_eth_xstat_name *xstats_names, unsigned int n); +static int ena_xstats_get_names_by_id(struct rte_eth_dev *dev, + const uint64_t *ids, + struct rte_eth_xstat_name *xstats_names, + unsigned int size); static int ena_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats, unsigned int n); @@ -254,29 +258,30 @@ static int ena_mp_primary_handle(const struct rte_mp_msg *mp_msg, const void *peer); static const struct eth_dev_ops ena_dev_ops = { - .dev_configure = ena_dev_configure, - .dev_infos_get = ena_infos_get, - .rx_queue_setup = ena_rx_queue_setup, - .tx_queue_setup = ena_tx_queue_setup, - .dev_start = ena_start, - .dev_stop = ena_stop, - .link_update = ena_link_update, - .stats_get = ena_stats_get, - .xstats_get_names = ena_xstats_get_names, - .xstats_get = ena_xstats_get, - .xstats_get_by_id = ena_xstats_get_by_id, - .mtu_set = ena_mtu_set, - .rx_queue_release = ena_rx_queue_release, - .tx_queue_release = ena_tx_queue_release, - .dev_close = ena_close, - .dev_reset = ena_dev_reset, - .reta_update = ena_rss_reta_update, - .reta_query = ena_rss_reta_query, - .rx_queue_intr_enable = ena_rx_queue_intr_enable, - .rx_queue_intr_disable = ena_rx_queue_intr_disable, - .rss_hash_update = ena_rss_hash_update, - .rss_hash_conf_get = ena_rss_hash_conf_get, - .tx_done_cleanup = ena_tx_cleanup, + .dev_configure = ena_dev_configure, + .dev_infos_get = ena_infos_get, + .rx_queue_setup = ena_rx_queue_setup, + .tx_queue_setup = ena_tx_queue_setup, + .dev_start = ena_start, + .dev_stop = ena_stop, + .link_update = ena_link_update, + .stats_get = ena_stats_get, + .xstats_get_names = ena_xstats_get_names, + .xstats_get_names_by_id = ena_xstats_get_names_by_id, + .xstats_get = ena_xstats_get, + .xstats_get_by_id = ena_xstats_get_by_id, + .mtu_set = ena_mtu_set, + .rx_queue_release = ena_rx_queue_release, + .tx_queue_release = ena_tx_queue_release, + .dev_close = ena_close, + .dev_reset = ena_dev_reset, + .reta_update = ena_rss_reta_update, + .reta_query = ena_rss_reta_query, + .rx_queue_intr_enable = ena_rx_queue_intr_enable, + .rx_queue_intr_disable = ena_rx_queue_intr_disable, + .rss_hash_update = ena_rss_hash_update, + .rss_hash_conf_get = ena_rss_hash_conf_get, + .tx_done_cleanup = ena_tx_cleanup, }; /********************************************************************* @@ -3165,6 +3170,85 @@ static int ena_xstats_get_names(struct rte_eth_dev *dev, return xstats_count; } +/** + * DPDK callback to retrieve names of extended device statistics for the given + * ids. + * + * @param dev + * Pointer to Ethernet device structure. + * @param[out] xstats_names + * Buffer to insert names into. + * @param ids + * IDs array for which the names should be retrieved. + * @param size + * Number of ids. + * + * @return + * Positive value: number of xstats names. Negative value: error code. + */ +static int ena_xstats_get_names_by_id(struct rte_eth_dev *dev, + const uint64_t *ids, + struct rte_eth_xstat_name *xstats_names, + unsigned int size) +{ + uint64_t xstats_count = ena_xstats_calc_num(dev->data); + uint64_t id, qid; + unsigned int i; + + if (xstats_names == NULL) + return xstats_count; + + for (i = 0; i < size; ++i) { + id = ids[i]; + if (id > xstats_count) { + PMD_DRV_LOG(ERR, + "ID value out of range: id=%" PRIu64 ", xstats_num=%" PRIu64 "\n", + id, xstats_count); + return -EINVAL; + } + + if (id < ENA_STATS_ARRAY_GLOBAL) { + strcpy(xstats_names[i].name, + ena_stats_global_strings[id].name); + continue; + } + + id -= ENA_STATS_ARRAY_GLOBAL; + if (id < ENA_STATS_ARRAY_ENI) { + strcpy(xstats_names[i].name, + ena_stats_eni_strings[id].name); + continue; + } + + id -= ENA_STATS_ARRAY_ENI; + if (id < ENA_STATS_ARRAY_RX) { + qid = id / dev->data->nb_rx_queues; + id %= dev->data->nb_rx_queues; + snprintf(xstats_names[i].name, + sizeof(xstats_names[i].name), + "rx_q%" PRIu64 "d_%s", + qid, ena_stats_rx_strings[id].name); + continue; + } + + id -= ENA_STATS_ARRAY_RX; + /* Although this condition is not needed, it was added for + * compatibility if new xstat structure would be ever added. + */ + if (id < ENA_STATS_ARRAY_TX) { + qid = id / dev->data->nb_tx_queues; + id %= dev->data->nb_tx_queues; + snprintf(xstats_names[i].name, + sizeof(xstats_names[i].name), + "tx_q%" PRIu64 "_%s", + qid, ena_stats_tx_strings[id].name); + continue; + } + } + + return i; +} + /** * DPDK callback to get extended device statistics. *