From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id A43A0438A2;
	Fri, 12 Jan 2024 13:33:13 +0100 (CET)
Received: from mails.dpdk.org (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id 6D864402CC;
	Fri, 12 Jan 2024 13:33:13 +0100 (CET)
Received: from frasgout.his.huawei.com (frasgout.his.huawei.com
 [185.176.79.56]) by mails.dpdk.org (Postfix) with ESMTP id B73FC402AC
 for <dev@dpdk.org>; Fri, 12 Jan 2024 13:33:12 +0100 (CET)
Received: from mail.maildlp.com (unknown [172.18.186.31])
 by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4TBLV05nQSz6K92s;
 Fri, 12 Jan 2024 20:30:32 +0800 (CST)
Received: from frapeml500006.china.huawei.com (unknown [7.182.85.219])
 by mail.maildlp.com (Postfix) with ESMTPS id 850A1140A36;
 Fri, 12 Jan 2024 20:33:11 +0800 (CST)
Received: from frapeml500007.china.huawei.com (7.182.85.172) by
 frapeml500006.china.huawei.com (7.182.85.219) with Microsoft SMTP Server
 (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id
 15.1.2507.35; Fri, 12 Jan 2024 13:33:11 +0100
Received: from frapeml500007.china.huawei.com ([7.182.85.172]) by
 frapeml500007.china.huawei.com ([7.182.85.172]) with mapi id 15.01.2507.035;
 Fri, 12 Jan 2024 13:33:11 +0100
From: Konstantin Ananyev <konstantin.ananyev@huawei.com>
To: "jerinj@marvell.com" <jerinj@marvell.com>, "dev@dpdk.org" <dev@dpdk.org>, 
 Thomas Monjalon <thomas@monjalon.net>, Ferruh Yigit <ferruh.yigit@amd.com>,
 Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
CC: "ferruh.yigit@xilinx.com" <ferruh.yigit@xilinx.com>,
 "ajit.khaparde@broadcom.com" <ajit.khaparde@broadcom.com>,
 "aboyer@pensando.io" <aboyer@pensando.io>, "beilei.xing@intel.com"
 <beilei.xing@intel.com>, "bruce.richardson@intel.com"
 <bruce.richardson@intel.com>, "chas3@att.com" <chas3@att.com>,
 "chenbo.xia@intel.com" <chenbo.xia@intel.com>, "ciara.loftus@intel.com"
 <ciara.loftus@intel.com>, "dsinghrawat@marvell.com"
 <dsinghrawat@marvell.com>, "ed.czeck@atomicrules.com"
 <ed.czeck@atomicrules.com>, "evgenys@amazon.com" <evgenys@amazon.com>,
 "grive@u256.net" <grive@u256.net>, "g.singh@nxp.com" <g.singh@nxp.com>,
 "haiyue.wang@intel.com" <haiyue.wang@intel.com>, "hkalra@marvell.com"
 <hkalra@marvell.com>, "heinrich.kuhn@corigine.com"
 <heinrich.kuhn@corigine.com>, "hemant.agrawal@nxp.com"
 <hemant.agrawal@nxp.com>, "hyonkim@cisco.com" <hyonkim@cisco.com>,
 "igorch@amazon.com" <igorch@amazon.com>, "irusskikh@marvell.com"
 <irusskikh@marvell.com>, "jgrajcia@cisco.com" <jgrajcia@cisco.com>,
 "jasvinder.singh@intel.com" <jasvinder.singh@intel.com>,
 "jianwang@trustnetic.com" <jianwang@trustnetic.com>,
 "jiawenwu@trustnetic.com" <jiawenwu@trustnetic.com>, "jingjing.wu@intel.com"
 <jingjing.wu@intel.com>, "johndale@cisco.com" <johndale@cisco.com>,
 "john.miller@atomicrules.com" <john.miller@atomicrules.com>,
 "linville@tuxdriver.com" <linville@tuxdriver.com>, "keith.wiles@intel.com"
 <keith.wiles@intel.com>, "kirankumark@marvell.com" <kirankumark@marvell.com>, 
 "lironh@marvell.com" <lironh@marvell.com>, "longli@microsoft.com"
 <longli@microsoft.com>, "mw@semihalf.com" <mw@semihalf.com>,
 "spinler@cesnet.cz" <spinler@cesnet.cz>, "matan@nvidia.com"
 <matan@nvidia.com>, "matt.peters@windriver.com" <matt.peters@windriver.com>,
 "maxime.coquelin@redhat.com" <maxime.coquelin@redhat.com>, "mk@semihalf.com"
 <mk@semihalf.com>, "humin (Q)" <humin29@huawei.com>, "pnalla@marvell.com"
 <pnalla@marvell.com>, "ndabilpuram@marvell.com" <ndabilpuram@marvell.com>,
 "qiming.yang@intel.com" <qiming.yang@intel.com>, "qi.z.zhang@intel.com"
 <qi.z.zhang@intel.com>, "radhac@marvell.com" <radhac@marvell.com>,
 "rahul.lakkireddy@chelsio.com" <rahul.lakkireddy@chelsio.com>,
 "rmody@marvell.com" <rmody@marvell.com>, "rosen.xu@intel.com"
 <rosen.xu@intel.com>, "sachin.saxena@oss.nxp.com"
 <sachin.saxena@oss.nxp.com>, "skoteshwar@marvell.com"
 <skoteshwar@marvell.com>, "shshaikh@marvell.com" <shshaikh@marvell.com>,
 "shaibran@amazon.com" <shaibran@amazon.com>, "shepard.siegel@atomicrules.com"
 <shepard.siegel@atomicrules.com>, "asomalap@amd.com" <asomalap@amd.com>,
 "somnath.kotur@broadcom.com" <somnath.kotur@broadcom.com>,
 "sthemmin@microsoft.com" <sthemmin@microsoft.com>,
 "steven.webster@windriver.com" <steven.webster@windriver.com>,
 "skori@marvell.com" <skori@marvell.com>, "mtetsuyah@gmail.com"
 <mtetsuyah@gmail.com>, "vburru@marvell.com" <vburru@marvell.com>,
 "viacheslavo@nvidia.com" <viacheslavo@nvidia.com>, "xiao.w.wang@intel.com"
 <xiao.w.wang@intel.com>, "Wangxiaoyun (Cloud)"
 <cloud.wangxiaoyun@huawei.com>, "Zhuangyuzeng (Yisen)"
 <yisen.zhuang@huawei.com>, "yongwang@vmware.com" <yongwang@vmware.com>,
 "Xuanziyang (William)" <william.xuanziyang@huawei.com>,
 "cristian.dumitrescu@intel.com" <cristian.dumitrescu@intel.com>
Subject: RE: [dpdk-dev] [v1] ethdev: support Tx queue used count
Thread-Topic: [dpdk-dev] [v1] ethdev: support Tx queue used count
Thread-Index: AQHaRKNlq/IhmEbhQ0W9f3VvMTUQlbDWHHGQ
Date: Fri, 12 Jan 2024 12:33:11 +0000
Message-ID: <2f45bf93d17a4ea688fdc23bf6f50027@huawei.com>
References: <20231219172948.3909749-1-jerinj@marvell.com>
 <20240111151745.3800170-1-jerinj@marvell.com>
In-Reply-To: <20240111151745.3800170-1-jerinj@marvell.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
x-originating-ip: [10.206.138.42]
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org

Hi Jerin,

> Introduce a new API to retrieve the number of used descriptors
> in a Tx queue. Applications can leverage this API in the fast path to
> inspect the Tx queue occupancy and take appropriate actions based on the
> available free descriptors.
>=20
> A notable use case could be implementing Random Early Discard (RED)
> in software based on Tx queue occupancy.
>=20
> Signed-off-by: Jerin Jacob <jerinj@marvell.com>
> ---
>  doc/guides/nics/features.rst         | 10 ++++
>  doc/guides/nics/features/default.ini |  1 +
>  lib/ethdev/ethdev_driver.h           |  2 +
>  lib/ethdev/ethdev_private.c          |  1 +
>  lib/ethdev/ethdev_trace_points.c     |  3 ++
>  lib/ethdev/rte_ethdev.h              | 74 ++++++++++++++++++++++++++++
>  lib/ethdev/rte_ethdev_core.h         |  7 ++-
>  lib/ethdev/rte_ethdev_trace_fp.h     |  8 +++
>  lib/ethdev/version.map               |  3 ++
>  9 files changed, 108 insertions(+), 1 deletion(-)
>=20
> rfc..v1:
> - Updated API similar to rte_eth_rx_queue_count() where it returns
> "used" count instead of "free" count
>=20
> diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
> index f7d9980849..0d5a8733fc 100644
> --- a/doc/guides/nics/features.rst
> +++ b/doc/guides/nics/features.rst
> @@ -962,6 +962,16 @@ management (see :doc:`../prog_guide/power_man` for m=
ore details).
>=20
>  * **[implements] eth_dev_ops**: ``get_monitor_addr``
>=20
> +.. _nic_features_tx_queue_used_count:
> +
> +Tx queue count
> +--------------
> +
> +Supports to get the number of used descriptors of a Tx queue.
> +
> +* **[implements] eth_dev_ops**: ``tx_queue_count``.
> +* **[related] API**: ``rte_eth_tx_queue_count()``.
> +
>  .. _nic_features_other:
>=20
>  Other dev ops not represented by a Feature
> diff --git a/doc/guides/nics/features/default.ini b/doc/guides/nics/featu=
res/default.ini
> index 806cb033ff..3ef6d45c0e 100644
> --- a/doc/guides/nics/features/default.ini
> +++ b/doc/guides/nics/features/default.ini
> @@ -59,6 +59,7 @@ Packet type parsing  =3D
>  Timesync             =3D
>  Rx descriptor status =3D
>  Tx descriptor status =3D
> +Tx queue count       =3D
>  Basic stats          =3D
>  Extended stats       =3D
>  Stats per queue      =3D
> diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h
> index b482cd12bb..f05f68a67c 100644
> --- a/lib/ethdev/ethdev_driver.h
> +++ b/lib/ethdev/ethdev_driver.h
> @@ -58,6 +58,8 @@ struct rte_eth_dev {
>  	eth_rx_queue_count_t rx_queue_count;
>  	/** Check the status of a Rx descriptor */
>  	eth_rx_descriptor_status_t rx_descriptor_status;
> +	/** Get the number of used Tx descriptors */
> +	eth_tx_queue_count_t tx_queue_count;
>  	/** Check the status of a Tx descriptor */
>  	eth_tx_descriptor_status_t tx_descriptor_status;
>  	/** Pointer to PMD transmit mbufs reuse function */
> diff --git a/lib/ethdev/ethdev_private.c b/lib/ethdev/ethdev_private.c
> index a656df293c..626524558a 100644
> --- a/lib/ethdev/ethdev_private.c
> +++ b/lib/ethdev/ethdev_private.c
> @@ -273,6 +273,7 @@ eth_dev_fp_ops_setup(struct rte_eth_fp_ops *fpo,
>  	fpo->tx_pkt_prepare =3D dev->tx_pkt_prepare;
>  	fpo->rx_queue_count =3D dev->rx_queue_count;
>  	fpo->rx_descriptor_status =3D dev->rx_descriptor_status;
> +	fpo->tx_queue_count =3D dev->tx_queue_count;
>  	fpo->tx_descriptor_status =3D dev->tx_descriptor_status;
>  	fpo->recycle_tx_mbufs_reuse =3D dev->recycle_tx_mbufs_reuse;
>  	fpo->recycle_rx_descriptors_refill =3D dev->recycle_rx_descriptors_refi=
ll;
> diff --git a/lib/ethdev/ethdev_trace_points.c b/lib/ethdev/ethdev_trace_p=
oints.c
> index 91f71d868b..e618414392 100644
> --- a/lib/ethdev/ethdev_trace_points.c
> +++ b/lib/ethdev/ethdev_trace_points.c
> @@ -481,6 +481,9 @@ RTE_TRACE_POINT_REGISTER(rte_eth_trace_count_aggr_por=
ts,
>  RTE_TRACE_POINT_REGISTER(rte_eth_trace_map_aggr_tx_affinity,
>  	lib.ethdev.map_aggr_tx_affinity)
>=20
> +RTE_TRACE_POINT_REGISTER(rte_eth_trace_tx_queue_count,
> +	lib.ethdev.tx_queue_count)
> +
>  RTE_TRACE_POINT_REGISTER(rte_flow_trace_copy,
>  	lib.ethdev.flow.copy)
>=20
> diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
> index 21e3a21903..af59da9652 100644
> --- a/lib/ethdev/rte_ethdev.h
> +++ b/lib/ethdev/rte_ethdev.h
> @@ -6803,6 +6803,80 @@ rte_eth_recycle_mbufs(uint16_t rx_port_id, uint16_=
t rx_queue_id,
>  __rte_experimental
>  int rte_eth_buffer_split_get_supported_hdr_ptypes(uint16_t port_id, uint=
32_t *ptypes, int num);
>=20
> +/**
> + * @warning
> + * @b EXPERIMENTAL: this API may change, or be removed, without prior no=
tice
> + *
> + * Get the number of used descriptors of a Tx queue
> + *
> + * This function retrieves the number of used descriptors of a transmit =
queue.
> + * Applications can use this API in the fast path to inspect Tx queue oc=
cupancy and take
> + * appropriate actions based on the available free descriptors.
> + * An example action could be implementing the Random Early Discard (RED=
).
=20
Sorry, I probably misunderstood your previous mails, but wouldn't it be mor=
e convenient
for user to have rte_eth_tx_queue_free_count(...) as fast-op, and
have rte_eth_tx_queue_count(...) {  queue_txd_num - rte_eth_tx_queue_free_c=
ount(...);}
as a slow-path function in rte_ethdev.c?
Konstantin=20

> + *
> + * Since it's a fast-path function, no check is performed on port_id and
> + * tx_queue_id. The caller must therefore ensure that the port is enable=
d
> + * and the queue is configured and running.
> + *
> + * @param port_id
> + *   The port identifier of the device.
> + * @param tx_queue_id
> + *   The index of the transmit queue.
> + *   The value must be in the range [0, nb_tx_queue - 1] previously supp=
lied
> + *   to rte_eth_dev_configure().
> + * @return
> + *  The number of used descriptors in the specific queue, or:
> + *   - (-ENODEV) if *port_id* is invalid. Enabled only when RTE_ETHDEV_D=
EBUG_TX is enabled
> + *   - (-EINVAL) if *queue_id* is invalid. Enabled only when RTE_ETHDEV_=
DEBUG_TX is enabled
> + *   - (-ENOTSUP) if the device does not support this function.
> + *
> + * @note This function is designed for fast-path use.
> + */
> +__rte_experimental
> +static inline int
> +rte_eth_tx_queue_count(uint16_t port_id, uint16_t tx_queue_id)
> +{
> +	struct rte_eth_fp_ops *fops;
> +	void *qd;
> +	int rc;
> +
> +#ifdef RTE_ETHDEV_DEBUG_TX
> +	if (port_id >=3D RTE_MAX_ETHPORTS || !rte_eth_dev_is_valid_port(port_id=
)) {
> +		RTE_ETHDEV_LOG_LINE(ERR, "Invalid port_id=3D%u", port_id);
> +		rc =3D -ENODEV;
> +		rte_eth_trace_tx_queue_count(port_id, tx_queue_id, rc);
> +		return rc;
> +	}
> +
> +	rc =3D -EINVAL;
> +	if (tx_queue_id >=3D RTE_MAX_QUEUES_PER_PORT) {
> +		RTE_ETHDEV_LOG_LINE(ERR, "Invalid Tx queue_id=3D%u for port_id=3D%u",
> +				    tx_queue_id, port_id);
> +		rte_eth_trace_tx_queue_count(port_id, tx_queue_id, rc);
> +		return rc;
> +	}
> +#endif
> +
> +	/* Fetch pointer to Tx queue data */
> +	fops =3D &rte_eth_fp_ops[port_id];
> +	qd =3D fops->txq.data[tx_queue_id];
> +
> +#ifdef RTE_ETHDEV_DEBUG_TX
> +	if (qd =3D=3D NULL) {
> +		RTE_ETHDEV_LOG_LINE(ERR, "Invalid Tx queue_id=3D%u for port_id=3D%u",
> +				    tx_queue_id, port_id);
> +		rte_eth_trace_tx_queue_count(port_id, tx_queue_id, rc);
> +		return rc;
> +	}
> +#endif
> +	if (fops->tx_queue_count =3D=3D NULL)
> +		return -ENOTSUP;
> +
> +	rc =3D fops->tx_queue_count(qd);
> +	rte_eth_trace_tx_queue_count(port_id, tx_queue_id, rc);
> +
> +	return rc;
> +}
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/lib/ethdev/rte_ethdev_core.h b/lib/ethdev/rte_ethdev_core.h
> index 4bfaf79c6c..d3f09f390d 100644
> --- a/lib/ethdev/rte_ethdev_core.h
> +++ b/lib/ethdev/rte_ethdev_core.h
> @@ -60,6 +60,9 @@ typedef uint16_t (*eth_recycle_tx_mbufs_reuse_t)(void *=
txq,
>  /** @internal Refill Rx descriptors with the recycling mbufs */
>  typedef void (*eth_recycle_rx_descriptors_refill_t)(void *rxq, uint16_t =
nb);
>=20
> +/** @internal Get number of used descriptors on a transmit queue. */
> +typedef int (*eth_tx_queue_count_t)(void *txq);
> +
>  /**
>   * @internal
>   * Structure used to hold opaque pointers to internal ethdev Rx/Tx
> @@ -116,7 +119,9 @@ struct rte_eth_fp_ops {
>  	eth_tx_descriptor_status_t tx_descriptor_status;
>  	/** Copy used mbufs from Tx mbuf ring into Rx. */
>  	eth_recycle_tx_mbufs_reuse_t recycle_tx_mbufs_reuse;
> -	uintptr_t reserved2[2];
> +	/** Get the number of used Tx descriptors. */
> +	eth_tx_queue_count_t tx_queue_count;
> +	uintptr_t reserved2[1];
>  	/**@}*/
>=20
>  } __rte_cache_aligned;
> diff --git a/lib/ethdev/rte_ethdev_trace_fp.h b/lib/ethdev/rte_ethdev_tra=
ce_fp.h
> index 186271c9ff..c98c488433 100644
> --- a/lib/ethdev/rte_ethdev_trace_fp.h
> +++ b/lib/ethdev/rte_ethdev_trace_fp.h
> @@ -73,6 +73,14 @@ RTE_TRACE_POINT_FP(
>  	rte_trace_point_emit_u64(count);
>  )
>=20
> +RTE_TRACE_POINT_FP(
> +	rte_eth_trace_tx_queue_count,
> +	RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id, int rc),
> +	rte_trace_point_emit_u16(port_id);
> +	rte_trace_point_emit_u16(tx_queue_id);
> +	rte_trace_point_emit_int(rc);
> +)
> +
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map
> index 5c4917c020..e03830902a 100644
> --- a/lib/ethdev/version.map
> +++ b/lib/ethdev/version.map
> @@ -316,6 +316,9 @@ EXPERIMENTAL {
>  	rte_eth_recycle_rx_queue_info_get;
>  	rte_flow_group_set_miss_actions;
>  	rte_flow_calc_table_hash;
> +
> +	# added in 24.03
> +	rte_eth_tx_queue_count;
>  };
>=20
>  INTERNAL {
> --
> 2.43.0