From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id B8FB0A04B7; Thu, 17 Sep 2020 07:34:06 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9AC121D5B4; Thu, 17 Sep 2020 07:31:25 +0200 (CEST) Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) by dpdk.org (Postfix) with ESMTP id B6FAA1D59A for ; Thu, 17 Sep 2020 07:31:18 +0200 (CEST) Received: by mail-lf1-f49.google.com with SMTP id y11so774949lfl.5 for ; Wed, 16 Sep 2020 22:31:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=YUcSPcuJehal1wAUlyoRBAW/+ZygYJjRRG4JCEOpXPw=; b=LSsp+S/1biXp2o0MffsvuDJUDXBsSZOSfcVwEDYwFePsXXeusWg0gUIRPozvGMpF1w IxsI2v0hIoVbAZ+O9rNQPCJvX1JvKnO/P0bMdwE6UbnvwJPsAXPVvcvDB/lt3AymN5xp Rslp5lPlepgfwWzxKozB5XdLIr2kRa2A+0Znp+duO2QLsZTO2YPqA7I2IfJAmIBtFg1H X9Wj+kjtD7uRp4uYzDWuxOTsHkXOFlGRUFoQy8oO/2QeHbTCgjbq156heLJqMq5P/6iF l3GgPNnL8XzibDTb22fEqRCAtRh83Jt9gvABzl+58P5croo2DUxXLILnA1TeCDZeWP3y WvMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YUcSPcuJehal1wAUlyoRBAW/+ZygYJjRRG4JCEOpXPw=; b=XSi3NNOJI99v47mDz8BTbCF1K/a9S2huBpWZ9gpz2M7sih5a1U8/EsHOy2W2pDnc9j 1F582oSDIZGJPLy/ZIEwCYsBPiJRHpi3sv4U9mOBzyoyg93mXpjBg27Neq2FohpUDEl2 gHg2iNHJbxY938nicueVmoyaAE2llq/OJmMdgkzw+FiUQszYQTuBlYgeBTWQM8zYU0NK /aBIlgQ7sdjS69plu7FfNmxP6dp0WKu6yr3lu4oEMjljXk3mlAPBQW0beztAcVaUMuzQ M7hJZtTFpMF0B+cs6IK9rc52z18ozqhLaJCyQKWttXbhD25VXaqut3mkw6RmFVINK8dJ vEMw== X-Gm-Message-State: AOAM531l3DVCfVHFg5SZ9z3mSg0aJ9gTQH5yueVgbmmuWOhIxLxofqNs 4BwrlHBen6etsMqtQ89DbbgIjBnKKdYdNuX7 X-Google-Smtp-Source: ABdhPJyB6vt2AfIq5gHH8fS64HDsk2316csj5Vd2ca2Bj9/Ld7x18zoLBH7I4/HKlwXo0OM9oEfEYw== X-Received: by 2002:a05:6512:2005:: with SMTP id a5mr8323889lfb.511.1600320677770; Wed, 16 Sep 2020 22:31:17 -0700 (PDT) Received: from mkPC.semihalf.local (193-106-246-138.noc.fibertech.net.pl. [193.106.246.138]) by smtp.gmail.com with ESMTPSA id j3sm5033686lfb.185.2020.09.16.22.31.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2020 22:31:17 -0700 (PDT) From: Michal Krawczyk To: dev@dpdk.org Cc: gtzalik@amazon.com, igorch@amazon.com, Michal Krawczyk , Marcin Wojtas , Evgeny Schemeilin Date: Thu, 17 Sep 2020 07:30:35 +0200 Message-Id: <20200917053035.1889989-21-mk@semihalf.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200917053035.1889989-1-mk@semihalf.com> References: <20200917053035.1889989-1-mk@semihalf.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH 20/20] net/ena: expose ENI stats as additional xstats X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 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" New HAL allows driver to read extra ENI stats. Exact meaning of each of them can be found in base/ena_defs/ena_admin_defs.h file and structure ena_admin_eni_stats. The ena_eni_stats structure is exactly the same as ena_admin_eni_stats, but it was required to be added for compatibility with xstats macros. Reading ENI stats requires communication with the admin queue. Signed-off-by: Michal Krawczyk Reviewed-by: Igor Chauskin Reviewed-by: Guy Tzalik --- drivers/net/ena/ena_ethdev.c | 77 +++++++++++++++++++++++++++++++++++- drivers/net/ena/ena_ethdev.h | 27 +++++++++++++ 2 files changed, 102 insertions(+), 2 deletions(-) diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c index 97e383315b..0ef18fee2c 100644 --- a/drivers/net/ena/ena_ethdev.c +++ b/drivers/net/ena/ena_ethdev.c @@ -72,6 +72,9 @@ struct ena_stats { #define ENA_STAT_TX_ENTRY(stat) \ ENA_STAT_ENTRY(stat, tx) +#define ENA_STAT_ENI_ENTRY(stat) \ + ENA_STAT_ENTRY(stat, eni) + #define ENA_STAT_GLOBAL_ENTRY(stat) \ ENA_STAT_ENTRY(stat, dev) @@ -91,6 +94,14 @@ static const struct ena_stats ena_stats_global_strings[] = { ENA_STAT_GLOBAL_ENTRY(tx_drops), }; +static const struct ena_stats ena_stats_eni_strings[] = { + ENA_STAT_ENI_ENTRY(bw_in_allowance_exceeded), + ENA_STAT_ENI_ENTRY(bw_out_allowance_exceeded), + ENA_STAT_ENI_ENTRY(pps_allowance_exceeded), + ENA_STAT_ENI_ENTRY(conntrack_allowance_exceeded), + ENA_STAT_ENI_ENTRY(linklocal_allowance_exceeded), +}; + static const struct ena_stats ena_stats_tx_strings[] = { ENA_STAT_TX_ENTRY(cnt), ENA_STAT_TX_ENTRY(bytes), @@ -114,6 +125,7 @@ static const struct ena_stats ena_stats_rx_strings[] = { }; #define ENA_STATS_ARRAY_GLOBAL ARRAY_SIZE(ena_stats_global_strings) +#define ENA_STATS_ARRAY_ENI ARRAY_SIZE(ena_stats_eni_strings) #define ENA_STATS_ARRAY_TX ARRAY_SIZE(ena_stats_tx_strings) #define ENA_STATS_ARRAY_RX ARRAY_SIZE(ena_stats_rx_strings) @@ -233,6 +245,7 @@ static int ena_process_bool_devarg(const char *key, void *opaque); static int ena_parse_devargs(struct ena_adapter *adapter, struct rte_devargs *devargs); +static int ena_copy_eni_stats(struct ena_adapter *adapter); static const struct eth_dev_ops ena_dev_ops = { .dev_configure = ena_dev_configure, @@ -451,7 +464,7 @@ static void ena_config_host_info(struct ena_com_dev *ena_dev) /* This function calculates the number of xstats based on the current config */ static unsigned int ena_xstats_calc_num(struct rte_eth_dev *dev) { - return ENA_STATS_ARRAY_GLOBAL + + return ENA_STATS_ARRAY_GLOBAL + ENA_STATS_ARRAY_ENI + (dev->data->nb_tx_queues * ENA_STATS_ARRAY_TX) + (dev->data->nb_rx_queues * ENA_STATS_ARRAY_RX); } @@ -2608,6 +2621,31 @@ static uint16_t eth_ena_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, return sent_idx; } +int ena_copy_eni_stats(struct ena_adapter *adapter) +{ + struct ena_admin_eni_stats admin_eni_stats; + int rc; + + rte_spinlock_lock(&adapter->admin_lock); + rc = ena_com_get_eni_stats(&adapter->ena_dev, &admin_eni_stats); + rte_spinlock_unlock(&adapter->admin_lock); + if (rc != 0) { + if (rc == ENA_COM_UNSUPPORTED) { + PMD_DRV_LOG(DEBUG, + "Retrieving ENI metrics is not supported.\n"); + } else { + PMD_DRV_LOG(WARNING, + "Failed to get ENI metrics: %d\n", rc); + } + return rc; + } + + rte_memcpy(&adapter->eni_stats, &admin_eni_stats, + sizeof(struct ena_stats_eni)); + + return 0; +} + /** * DPDK callback to retrieve names of extended device statistics * @@ -2635,6 +2673,10 @@ static int ena_xstats_get_names(struct rte_eth_dev *dev, strcpy(xstats_names[count].name, ena_stats_global_strings[stat].name); + for (stat = 0; stat < ENA_STATS_ARRAY_ENI; stat++, count++) + strcpy(xstats_names[count].name, + ena_stats_eni_strings[stat].name); + for (stat = 0; stat < ENA_STATS_ARRAY_RX; stat++) for (i = 0; i < dev->data->nb_rx_queues; i++, count++) snprintf(xstats_names[count].name, @@ -2690,6 +2732,19 @@ static int ena_xstats_get(struct rte_eth_dev *dev, ((char *)stats_begin + stat_offset)); } + /* Even if the function below fails, we should copy previous (or initial + * values) to keep structure of rte_eth_xstat consistent. + */ + ena_copy_eni_stats(adapter); + for (stat = 0; stat < ENA_STATS_ARRAY_ENI; stat++, count++) { + stat_offset = ena_stats_eni_strings[stat].stat_offset; + stats_begin = &adapter->eni_stats; + + xstats[count].id = count; + xstats[count].value = *((uint64_t *) + ((char *)stats_begin + stat_offset)); + } + for (stat = 0; stat < ENA_STATS_ARRAY_RX; stat++) { for (i = 0; i < dev->data->nb_rx_queues; i++, count++) { stat_offset = ena_stats_rx_strings[stat].stat_offset; @@ -2726,6 +2781,8 @@ static int ena_xstats_get_by_id(struct rte_eth_dev *dev, unsigned int i; int qid; int valid = 0; + bool was_eni_copied = false; + for (i = 0; i < n; ++i) { id = ids[i]; /* Check if id belongs to global statistics */ @@ -2735,8 +2792,24 @@ static int ena_xstats_get_by_id(struct rte_eth_dev *dev, continue; } - /* Check if id belongs to rx queue statistics */ + /* Check if id belongs to ENI statistics */ id -= ENA_STATS_ARRAY_GLOBAL; + if (id < ENA_STATS_ARRAY_ENI) { + /* Avoid reading ENI stats multiple times in a single + * function call, as it requires communication with the + * admin queue. + */ + if (!was_eni_copied) { + was_eni_copied = true; + ena_copy_eni_stats(adapter); + } + values[i] = *((uint64_t *)&adapter->eni_stats + id); + ++valid; + continue; + } + + /* Check if id belongs to rx queue statistics */ + id -= ENA_STATS_ARRAY_ENI; rx_entries = ENA_STATS_ARRAY_RX * dev->data->nb_rx_queues; if (id < rx_entries) { qid = id % dev->data->nb_rx_queues; diff --git a/drivers/net/ena/ena_ethdev.h b/drivers/net/ena/ena_ethdev.h index ddc80dade0..7bb74a1d06 100644 --- a/drivers/net/ena/ena_ethdev.h +++ b/drivers/net/ena/ena_ethdev.h @@ -171,6 +171,32 @@ struct ena_stats_dev { u64 tx_drops; }; +struct ena_stats_eni { + /* + * The number of packets shaped due to inbound aggregate BW + * allowance being exceeded + */ + uint64_t bw_in_allowance_exceeded; + /* + * The number of packets shaped due to outbound aggregate BW + * allowance being exceeded + */ + uint64_t bw_out_allowance_exceeded; + /* The number of packets shaped due to PPS allowance being exceeded */ + uint64_t pps_allowance_exceeded; + /* + * The number of packets shaped due to connection tracking + * allowance being exceeded and leading to failure in establishment + * of new connections + */ + uint64_t conntrack_allowance_exceeded; + /* + * The number of packets shaped due to linklocal packet rate + * allowance being exceeded + */ + uint64_t linklocal_allowance_exceeded; +}; + struct ena_offloads { bool tso4_supported; bool tx_csum_supported; @@ -231,6 +257,7 @@ struct ena_adapter { uint64_t keep_alive_timeout; struct ena_stats_dev dev_stats; + struct ena_stats_eni eni_stats; bool trigger_reset; -- 2.25.1