From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-eopbgr140058.outbound.protection.outlook.com [40.107.14.58]) by dpdk.org (Postfix) with ESMTP id 918D8262E for ; Tue, 27 Nov 2018 09:09:27 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=j5QSHq2XyP5yhr7lBVyzcJfb0zGx4LT9QqhPEjNeotg=; b=ThTEZsboolc2bKQ5+XDzsckpb+dm+gZXP07aomuWt6WsinGvmUDpcbsTnU0461OEQsOlho2dq8/M8ZQMzQVBIwnc80BF/60Oyus34gX/NUpvw5UocgP7p8U3fikiwUgH/+aF3o/di55TlRrUixiPREcpFQi1eu9RAqgA0bFY/oY= Received: from DB7PR05MB4426.eurprd05.prod.outlook.com (52.134.109.15) by DB7PR05MB4153.eurprd05.prod.outlook.com (52.134.107.146) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1361.19; Tue, 27 Nov 2018 08:09:24 +0000 Received: from DB7PR05MB4426.eurprd05.prod.outlook.com ([fe80::f59c:f6f0:665b:8b16]) by DB7PR05MB4426.eurprd05.prod.outlook.com ([fe80::f59c:f6f0:665b:8b16%4]) with mapi id 15.20.1361.019; Tue, 27 Nov 2018 08:09:24 +0000 From: Shahaf Shuler To: Tom Barbette , "dev@dpdk.org" CC: Yongseok Koh , swx_dpdk Thread-Topic: [PATCH v2] mlx5: Report imissed stat Thread-Index: AQHUgwMS/tEZR8Z6ekeoiJ/h1vXSSKVjSqtw Date: Tue, 27 Nov 2018 08:09:24 +0000 Message-ID: References: <1542960217-29436-1-git-send-email-barbette@kth.se> In-Reply-To: <1542960217-29436-1-git-send-email-barbette@kth.se> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=shahafs@mellanox.com; x-originating-ip: [31.154.10.105] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; DB7PR05MB4153; 6:6Wv5eO+/EpGAfdPwzHxbUByW9S5tZlkkQYcc3HUqxhTeeWWZbpSnWb2HXfJ0u7QZbYUA+680In9o/PMeNWZG02U559s4BMZv53y/rLz1at+S3x3Fv1BU2slJmGZCck7a1jdfBc2DvDhUDmY0FFJ1+xe+BqnGlj+Z3QgBZHJ5Jh2+P7TQA8cm3f3Qbena0a8Teu/0Tdd60w8xyFdPUxvexWNT1tqEMJOAR8LIOSf5H1AtC/yOxCM71goMpb9argqfTGyuNWRjQPM60mPdMLyFyzVCjphoVtftIX/RnuOj8TsoN6x8YBH6U8/6IfQfDICCXtP5FYMygWfiY2XPsSnPCww2MBK/Hmti3SuNkXTmll6r8b6gvJcXJbSmC7djFu7QoMLx5533EQRg+RMoWCXh8pTiNdfv+bVmb1xebaPxIWB/IMhuaHcQ0OOcGkWqPfGwEKTqseUNCpW3DViJFVUYlQ==; 5:ouuH9SnJLpA892dS8EKeXIoXe0j1lqgq7VlEiLbo6zxZ6P/Jzl3tl2JUHzh6otm4pPkThxlUbHb8ZHUY5H0Lwu33s5Bt3kWK/A01L57smEj7QiYY2zu4VdKY7hjkxHi2CCIBo1bxBSrVq36SBzR37Gi5oSsbAchmxjGXt1sZNdU=; 7:/F8G+uXWXJ38UIJTg+tNLANmX7px+AM5tvkyVsl/XRTPtgKTmXmuaEaQMi3mnUmWzlQc0UYi7TsFDeqGSd/jMUYgDOMmLre0JscaD6prp55f71F2sSVDHKr6Lsxd58StGtktcVp50WwiNQSEXl4kTA== x-ms-exchange-antispam-srfa-diagnostics: SOS; x-ms-office365-filtering-correlation-id: 18596e5c-0c88-47b2-4e31-08d6543fa4ea x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390098)(7020095)(4652040)(8989299)(5600074)(711020)(4618075)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:DB7PR05MB4153; x-ms-traffictypediagnostic: DB7PR05MB4153: x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(10201501046)(3002001)(93006095)(93001095)(3231443)(944501410)(52105112)(6055026)(148016)(149066)(150057)(6041310)(20161123562045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123560045)(201708071742011)(7699051)(76991095); SRVR:DB7PR05MB4153; BCL:0; PCL:0; RULEID:; SRVR:DB7PR05MB4153; x-forefront-prvs: 086943A159 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(376002)(396003)(136003)(39860400002)(346002)(366004)(189003)(199004)(53936002)(86362001)(575784001)(26005)(7736002)(316002)(106356001)(107886003)(256004)(105586002)(25786009)(6246003)(14444005)(6436002)(229853002)(8676002)(81166006)(81156014)(33656002)(186003)(7696005)(74316002)(305945005)(68736007)(76176011)(6506007)(66066001)(71190400001)(102836004)(5660300001)(71200400001)(478600001)(14454004)(4326008)(54906003)(99286004)(2906002)(9686003)(97736004)(2501003)(3846002)(6116002)(8936002)(55016002)(486006)(476003)(110136005)(446003)(11346002); DIR:OUT; SFP:1101; SCL:1; SRVR:DB7PR05MB4153; H:DB7PR05MB4426.eurprd05.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: sdVQK3la6FMaRwd4IwqoTvT1XKEVZ+9E5gBu/NA9rkWYR3/jfNsSvmeH2cG+xFp1L2Fcp6bNPgZG9ShzulrdYmO4JTMDDc9HVBcZA7HTcB+QogxxGfA8Mu2YZcnfG5L0qbHdswa/QD3CpibLx4cnZbukqIrrAZrH33/p8bx646U0OAKrHRdTIMBA8WfKPVVxTJfIjPWpT0gV9lUtODpkJtnh2NcoI91J2bIR2W/mXLMch6u+LZqzyFRaaGm+lJyA6rmNKJFKYvXJ5kelg9oQO08j27djrnST9VVo7qjBXL3gl/WdYBBf1/5eV6L8K8HfIIM6CJn1NgJyzG9auISJlThd7aHUyz70S8rx2uzqAls= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: 18596e5c-0c88-47b2-4e31-08d6543fa4ea X-MS-Exchange-CrossTenant-originalarrivaltime: 27 Nov 2018 08:09:24.4745 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB7PR05MB4153 Subject: Re: [dpdk-dev] [PATCH v2] mlx5: Report imissed stat 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: , X-List-Received-Date: Tue, 27 Nov 2018 08:09:27 -0000 Friday, November 23, 2018 10:04 AM, Friday, November 23, 2018: > Subject: [PATCH v2] mlx5: Report imissed stat >=20 > The imissed counters (number of packets dropped because the queues were > full) were actually reported through xstats as "rx_out_of_buffer" > but was not reported through stats. >=20 > Following a recent discussion on the ML, as there is no way to tell the u= ser if a > counter is implemented or not, this should be considered a bug. Eg, user > looking at imissed will think the packets are lost before reaching the de= vice. >=20 > As for xstats, I added a base counter to be able to "reset" imissed. >=20 > v2: > - Add rx_discards_phy xstats counter > - Add documentation > - Follow suggestions from Shahaf Shuler as per > v1 comments >=20 > Signed-off-by: Tom Barbette Applied to next-net-mlx, with small modifications due to rebase issues. Tom - please have a second look and confirm. > --- > doc/guides/nics/mlx5.rst | 2 +- > drivers/net/mlx5/mlx5.h | 8 ++++++- > drivers/net/mlx5/mlx5_stats.c | 53 ++++++++++++++++++++++++++++---- > --------- > drivers/net/mlx5/mlx5_trigger.c | 2 +- > 4 files changed, 46 insertions(+), 19 deletions(-) >=20 > diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst index > 52e1213..ddc0fdd 100644 > --- a/doc/guides/nics/mlx5.rst > +++ b/doc/guides/nics/mlx5.rst > @@ -141,7 +141,7 @@ Statistics >=20 > MLX5 supports various of methods to report statistics: >=20 > -Port statistics can be queried using ``rte_eth_stats_get()``. The port s= tatistics > are through SW only and counts the number of packets received or sent > successfully by the PMD. > +Port statistics can be queried using ``rte_eth_stats_get()``. The receiv= ed > and sent statistics are through SW only and counts the number of packets > received or sent successfully by the PMD. The imissed counter is the amou= nt > of packets that could not be delivered to SW because a queue was full. > Packets not received due to congestion in the bus or on the NIC can be > queried via the rx_discards_phy xstats counter. >=20 > Extended statistics can be queried using ``rte_eth_xstats_get()``. The > extended statistics expose a wider set of counters counted by the device. > The extended port statistics counts the number of packets received or sen= t > successfully by the port. As Mellanox NICs are using the :ref:`Bifurcated= Linux > Driver ` those counters counts also packet recei= ved > or sent by the Linux kernel. The counters with ``_phy`` suffix counts the= total > events on the physical port, therefore not valid for VF. >=20 > diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index > a3a34cf..1aaaafe 100644 > --- a/drivers/net/mlx5/mlx5.h > +++ b/drivers/net/mlx5/mlx5.h > @@ -79,6 +79,11 @@ struct mlx5_xstats_ctrl { > uint64_t base[MLX5_MAX_XSTATS]; > }; >=20 > +struct mlx5_stats_ctrl { > + /* Base for imissed counter. */ > + uint64_t imissed_base; > +}; > + > /* Flow list . */ > TAILQ_HEAD(mlx5_flows, rte_flow); >=20 > @@ -214,6 +219,7 @@ struct priv { > LIST_HEAD(ind_tables, mlx5_ind_table_ibv) ind_tbls; > uint32_t link_speed_capa; /* Link speed capabilities. */ > struct mlx5_xstats_ctrl xstats_ctrl; /* Extended stats control. */ > + struct mlx5_stats_ctrl stats_ctrl; /* Stats control. */ > int primary_socket; /* Unix socket for primary process. */ > void *uar_base; /* Reserved address space for UAR mapping */ > struct rte_intr_handle intr_handle_socket; /* Interrupt handler. */ > @@ -309,7 +315,7 @@ void mlx5_allmulticast_disable(struct rte_eth_dev > *dev); >=20 > /* mlx5_stats.c */ >=20 > -void mlx5_xstats_init(struct rte_eth_dev *dev); > +void mlx5_stats_init(struct rte_eth_dev *dev); > int mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)= ; > void mlx5_stats_reset(struct rte_eth_dev *dev); int mlx5_xstats_get(stru= ct > rte_eth_dev *dev, struct rte_eth_xstat *stats, diff --git > a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c index > 91f3d47..323f8fb 100644 > --- a/drivers/net/mlx5/mlx5_stats.c > +++ b/drivers/net/mlx5/mlx5_stats.c > @@ -108,6 +108,14 @@ static const struct mlx5_counter_ctrl > mlx5_counters_init[] =3D { > .ctr_name =3D "rx_packets_phy", > }, > { > + .dpdk_name =3D "tx_discards_phy", > + .ctr_name =3D "tx_discards_phy", > + }, > + { > + .dpdk_name =3D "rx_discards_phy", > + .ctr_name =3D "rx_discards_phy", > + }, > + { > .dpdk_name =3D "tx_bytes_phy", > .ctr_name =3D "tx_bytes_phy", > }, > @@ -119,6 +127,24 @@ static const struct mlx5_counter_ctrl > mlx5_counters_init[] =3D { >=20 > static const unsigned int xstats_n =3D RTE_DIM(mlx5_counters_init); >=20 > +static inline void > +mlx5_read_ib_stat(struct priv *priv, const char *ctr_name, uint64_t > +*stat) { > + FILE *file; > + MKSTR(path, "%s/ports/1/hw_counters/%s", > + priv->ibdev_path, > + ctr_name); > + > + file =3D fopen(path, "rb"); > + if (file) { > + int n =3D fscanf(file, "%" SCNu64, stat); > + > + fclose(file); > + if (n !=3D 1) > + stat =3D 0; > + } > +} > + > /** > * Read device counters table. > * > @@ -155,19 +181,8 @@ mlx5_read_dev_counters(struct rte_eth_dev *dev, > uint64_t *stats) > } > for (i =3D 0; i !=3D xstats_n; ++i) { > if (mlx5_counters_init[i].ib) { > - FILE *file; > - MKSTR(path, "%s/ports/1/hw_counters/%s", > - priv->ibdev_path, > - mlx5_counters_init[i].ctr_name); > - > - file =3D fopen(path, "rb"); > - if (file) { > - int n =3D fscanf(file, "%" SCNu64, &stats[i]); > - > - fclose(file); > - if (n !=3D 1) > - stats[i] =3D 0; > - } > + mlx5_read_ib_stat(priv, > mlx5_counters_init[i].ctr_name, > + &stats[i]); > } else { > stats[i] =3D (uint64_t) > et_stats->data[xstats_ctrl- > >dev_table_idx[i]]; > @@ -210,10 +225,11 @@ mlx5_ethtool_get_stats_n(struct rte_eth_dev > *dev) { > * Pointer to Ethernet device. > */ > void > -mlx5_xstats_init(struct rte_eth_dev *dev) > +mlx5_stats_init(struct rte_eth_dev *dev) > { > struct priv *priv =3D dev->data->dev_private; > struct mlx5_xstats_ctrl *xstats_ctrl =3D &priv->xstats_ctrl; > + struct mlx5_stats_ctrl *stats_ctrl =3D &priv->stats_ctrl; > unsigned int i; > unsigned int j; > struct ifreq ifr; > @@ -281,6 +297,7 @@ mlx5_xstats_init(struct rte_eth_dev *dev) > if (ret) > DRV_LOG(ERR, "port %u cannot read device counters: %s", > dev->data->port_id, strerror(rte_errno)); > + mlx5_read_ib_stat(priv, "out_of_buffer", &stats_ctrl- > >imissed_base); > free: > rte_free(strings); > } > @@ -316,7 +333,7 @@ mlx5_xstats_get(struct rte_eth_dev *dev, struct > rte_eth_xstat *stats, > if (stats_n < 0) > return stats_n; > if (xstats_ctrl->stats_n !=3D stats_n) > - mlx5_xstats_init(dev); > + mlx5_stats_init(dev); > ret =3D mlx5_read_dev_counters(dev, counters); > if (ret) > return ret; > @@ -389,6 +406,8 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct > rte_eth_stats *stats) #endif > tmp.oerrors +=3D txq->stats.oerrors; > } > + mlx5_read_ib_stat(priv, "out_of_buffer", &tmp.imissed); > + tmp.imissed -=3D priv->stats_ctrl.imissed_base; > #ifndef MLX5_PMD_SOFT_COUNTERS > /* FIXME: retrieve and add hardware counters. */ #endif @@ -406,6 > +425,7 @@ void mlx5_stats_reset(struct rte_eth_dev *dev) { > struct priv *priv =3D dev->data->dev_private; > + struct mlx5_stats_ctrl *stats_ctrl =3D &priv->stats_ctrl; > unsigned int i; > unsigned int idx; >=20 > @@ -423,6 +443,7 @@ mlx5_stats_reset(struct rte_eth_dev *dev) > (*priv->txqs)[i]->stats =3D > (struct mlx5_txq_stats){ .idx =3D idx }; > } > + mlx5_read_ib_stat(priv, "out_of_buffer", &stats_ctrl- > >imissed_base); > #ifndef MLX5_PMD_SOFT_COUNTERS > /* FIXME: reset hardware counters. */ > #endif > @@ -452,7 +473,7 @@ mlx5_xstats_reset(struct rte_eth_dev *dev) > return; > } > if (xstats_ctrl->stats_n !=3D stats_n) > - mlx5_xstats_init(dev); > + mlx5_stats_init(dev); > ret =3D mlx5_read_dev_counters(dev, counters); > if (ret) { > DRV_LOG(ERR, "port %u cannot read device counters: %s", > diff --git a/drivers/net/mlx5/mlx5_trigger.c > b/drivers/net/mlx5/mlx5_trigger.c index e2a9bb7..3015edd 100644 > --- a/drivers/net/mlx5/mlx5_trigger.c > +++ b/drivers/net/mlx5/mlx5_trigger.c > @@ -181,7 +181,7 @@ mlx5_dev_start(struct rte_eth_dev *dev) > dev->data->port_id); > goto error; > } > - mlx5_xstats_init(dev); > + mlx5_stats_init(dev); > ret =3D mlx5_traffic_enable(dev); > if (ret) { > DRV_LOG(DEBUG, "port %u failed to set defaults flows", > -- > 2.7.4