From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 ; 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 To: "jerinj@marvell.com" , "dev@dpdk.org" , Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko CC: "ferruh.yigit@xilinx.com" , "ajit.khaparde@broadcom.com" , "aboyer@pensando.io" , "beilei.xing@intel.com" , "bruce.richardson@intel.com" , "chas3@att.com" , "chenbo.xia@intel.com" , "ciara.loftus@intel.com" , "dsinghrawat@marvell.com" , "ed.czeck@atomicrules.com" , "evgenys@amazon.com" , "grive@u256.net" , "g.singh@nxp.com" , "haiyue.wang@intel.com" , "hkalra@marvell.com" , "heinrich.kuhn@corigine.com" , "hemant.agrawal@nxp.com" , "hyonkim@cisco.com" , "igorch@amazon.com" , "irusskikh@marvell.com" , "jgrajcia@cisco.com" , "jasvinder.singh@intel.com" , "jianwang@trustnetic.com" , "jiawenwu@trustnetic.com" , "jingjing.wu@intel.com" , "johndale@cisco.com" , "john.miller@atomicrules.com" , "linville@tuxdriver.com" , "keith.wiles@intel.com" , "kirankumark@marvell.com" , "lironh@marvell.com" , "longli@microsoft.com" , "mw@semihalf.com" , "spinler@cesnet.cz" , "matan@nvidia.com" , "matt.peters@windriver.com" , "maxime.coquelin@redhat.com" , "mk@semihalf.com" , "humin (Q)" , "pnalla@marvell.com" , "ndabilpuram@marvell.com" , "qiming.yang@intel.com" , "qi.z.zhang@intel.com" , "radhac@marvell.com" , "rahul.lakkireddy@chelsio.com" , "rmody@marvell.com" , "rosen.xu@intel.com" , "sachin.saxena@oss.nxp.com" , "skoteshwar@marvell.com" , "shshaikh@marvell.com" , "shaibran@amazon.com" , "shepard.siegel@atomicrules.com" , "asomalap@amd.com" , "somnath.kotur@broadcom.com" , "sthemmin@microsoft.com" , "steven.webster@windriver.com" , "skori@marvell.com" , "mtetsuyah@gmail.com" , "vburru@marvell.com" , "viacheslavo@nvidia.com" , "xiao.w.wang@intel.com" , "Wangxiaoyun (Cloud)" , "Zhuangyuzeng (Yisen)" , "yongwang@vmware.com" , "Xuanziyang (William)" , "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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-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 > --- > 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