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 6AD5EA0543; Tue, 4 Oct 2022 11:02:56 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 45E3E40DDC; Tue, 4 Oct 2022 11:02:56 +0200 (CEST) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id AFFD040A87 for ; Tue, 4 Oct 2022 11:02:54 +0200 (CEST) Received: from [192.168.38.17] (aros.oktetlabs.ru [192.168.38.17]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by shelob.oktetlabs.ru (Postfix) with ESMTPSA id 25F135D; Tue, 4 Oct 2022 12:02:54 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 25F135D DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=oktetlabs.ru; s=default; t=1664874174; bh=Vdd+VewosuEWZIntbXGqWcSL57oxEWG0nzo0EyxDB4s=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=eNUZpFXqkVXzVtg/nStmI9j3eGWtEJJjs/dubKleZGafLautLzz7mgiS/yh/NyYhF ep8bV0UBlwaproorIsqkOwngDtkCM0QznlM808OXdQx6m7hyR80T3d0WfU7D51JBJY gk92rAldqbGsMPMyBSUmhR83WWRH6XCs7Dudq4N8= Message-ID: <670f8dc9-75ad-de91-4268-9d7f9dcfb2ef@oktetlabs.ru> Date: Tue, 4 Oct 2022 12:02:53 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.3.0 Subject: Re: [PATCH v3 1/1] ethdev: support congestion management Content-Language: en-US To: skori@marvell.com, Ferruh Yigit , Thomas Monjalon , Ray Kinsella Cc: dev@dpdk.org, Jerin Jacob References: <20220919121534.1058884-1-skori@marvell.com> <20220929093503.2172344-1-skori@marvell.com> From: Andrew Rybchenko Organization: OKTET Labs In-Reply-To: <20220929093503.2172344-1-skori@marvell.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit 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 On 9/29/22 12:35, skori@marvell.com wrote: > From: Jerin Jacob > > NIC HW controllers often come with congestion management support on > various HW objects such as Rx queue depth or mempool queue depth. > > Also, it can support various modes of operation such as RED > (Random early discard), WRED etc on those HW objects. > > This patch adds a framework to express such modes(enum rte_cman_mode) > and introduce (enum rte_eth_cman_obj) to enumerate the different > objects where the modes can operate on. > > This patch adds RTE_CMAN_RED mode of operation and This patch adds -> Add > RTE_ETH_CMAN_OBJ_RX_QUEUE, RTE_ETH_CMAN_OBJ_RX_QUEUE_MEMPOOL object. > > Introduced reserved fields in configuration structure Introduce > backed by rte_eth_cman_config_init() to add new configuration > parameters without ABI breakage. > > Added rte_eth_cman_info_get() API to get the information such as Add > supported modes and objects. > > Added rte_eth_cman_config_init(), rte_eth_cman_config_set() APIs Add > to configure congestion management on those object with associated mode. > > Finally, Added rte_eth_cman_config_get() API to retrieve the add > applied configuration. > > Signed-off-by: Jerin Jacob > Signed-off-by: Sunil Kumar Kori I'll send v4 with few minor correction. > --- > v2..v3: > - Rename rte_cman.c to rte_ethdev_cman.c > - Move lib/eal/include/rte_cman.h to lib/ethdev/rte_cman.h > - Fix review comments (Andrew Rybchenko) > - Add release notes > > v1..v2: > - Fix review comments (Akhil Goyal) > > rfc..v1: > - Added RED specification (http://www.aciri.org/floyd/papers/red/red.html) link > - Fixed doxygen comment issue (Min Hu) > > doc/guides/nics/features.rst | 12 ++ > doc/guides/nics/features/default.ini | 1 + > doc/guides/rel_notes/release_22_11.rst | 6 + > lib/ethdev/ethdev_driver.h | 25 ++++ > lib/ethdev/ethdev_private.c | 12 ++ > lib/ethdev/ethdev_private.h | 2 + > lib/ethdev/meson.build | 2 + > lib/ethdev/rte_cman.h | 55 +++++++++ > lib/ethdev/rte_ethdev.h | 164 +++++++++++++++++++++++++ > lib/ethdev/rte_ethdev_cman.c | 101 +++++++++++++++ > lib/ethdev/version.map | 6 + > 11 files changed, 386 insertions(+) > create mode 100644 lib/ethdev/rte_cman.h > create mode 100644 lib/ethdev/rte_ethdev_cman.c > > diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst > index b4a8e9881c..70ca46e651 100644 > --- a/doc/guides/nics/features.rst > +++ b/doc/guides/nics/features.rst > @@ -727,6 +727,18 @@ Supports configuring per-queue stat counter mapping. > ``rte_eth_dev_set_tx_queue_stats_mapping()``. > > > +.. _nic_features_congestion_management: > + > +Congestion management > +--------------------- > + > +Supports congestion management. > + > +* **[implements] eth_dev_ops**: ``cman_info_get``, ``cman_config_set``, ``cman_config_get``. > +* **[related] API**: ``rte_eth_cman_info_get()``, ``rte_eth_cman_config_init()``, > + ``rte_eth_cman_config_set()``, ``rte_eth_cman_config_get()``. > + > + > .. _nic_features_fw_version: > > FW version > diff --git a/doc/guides/nics/features/default.ini b/doc/guides/nics/features/default.ini > index f7192cb0da..a9c0008ebd 100644 > --- a/doc/guides/nics/features/default.ini > +++ b/doc/guides/nics/features/default.ini > @@ -60,6 +60,7 @@ Tx descriptor status = > Basic stats = > Extended stats = > Stats per queue = > +Congestion management = > FW version = > EEPROM dump = > Module EEPROM dump = > diff --git a/doc/guides/rel_notes/release_22_11.rst b/doc/guides/rel_notes/release_22_11.rst > index 0231959874..ea9908e578 100644 > --- a/doc/guides/rel_notes/release_22_11.rst > +++ b/doc/guides/rel_notes/release_22_11.rst > @@ -81,6 +81,12 @@ New Features > * Added AES-CCM support in lookaside protocol (IPsec) for CN9K & CN10K. > * Added AES & DES DOCSIS algorithm support in lookaside crypto for CN9K. > > +* **Added support for congestion management for ethdev.** > + > + Added new APIs ``rte_eth_cman_config_init()``, ``rte_eth_cman_config_get()``, > + ``rte_eth_cman_config_set()``, ``rte_eth_cman_info_get()`` > + to support congestion management. > + The position is a bit incorrect. It should go after ethdev items. > * **Added eventdev adapter instance get API.** > > * Added ``rte_event_eth_rx_adapter_instance_get`` to get Rx adapter > diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h > index 8cd8eb8685..e1e2d10a35 100644 > --- a/lib/ethdev/ethdev_driver.h > +++ b/lib/ethdev/ethdev_driver.h > @@ -1094,6 +1094,22 @@ typedef int (*eth_rx_queue_avail_thresh_query_t)(struct rte_eth_dev *dev, > uint16_t *rx_queue_id, > uint8_t *avail_thresh); > > +/** @internal Get congestion management information. */ > +typedef int (*eth_cman_info_get_t)(struct rte_eth_dev *dev, > + struct rte_eth_cman_info *info); > + > +/** @internal Init congestion management structure with default values. */ > +typedef int (*eth_cman_config_init_t)(struct rte_eth_dev *dev, > + struct rte_eth_cman_config *config); > + > +/** @internal Configure congestion management on a port. */ > +typedef int (*eth_cman_config_set_t)(struct rte_eth_dev *dev, > + const struct rte_eth_cman_config *config); > + > +/** @internal Retrieve congestion management configuration of a port. */ > +typedef int (*eth_cman_config_get_t)(struct rte_eth_dev *dev, > + struct rte_eth_cman_config *config); > + > /** > * @internal A structure containing the functions exported by an Ethernet driver. > */ > @@ -1309,6 +1325,15 @@ struct eth_dev_ops { > eth_rx_queue_avail_thresh_set_t rx_queue_avail_thresh_set; > /** Query Rx queue available descriptors threshold event */ > eth_rx_queue_avail_thresh_query_t rx_queue_avail_thresh_query; > + > + /** Get congestion management information */ > + eth_cman_info_get_t cman_info_get; > + /** Initialize congestion management structure with default values */ > + eth_cman_config_init_t cman_config_init; > + /** Configure congestion management */ > + eth_cman_config_set_t cman_config_set; > + /** Retrieve congestion management configuration */ > + eth_cman_config_get_t cman_config_get; > }; > > /** > diff --git a/lib/ethdev/ethdev_private.c b/lib/ethdev/ethdev_private.c > index 48090c879a..8787c3985e 100644 > --- a/lib/ethdev/ethdev_private.c > +++ b/lib/ethdev/ethdev_private.c > @@ -27,6 +27,18 @@ eth_dev_to_id(const struct rte_eth_dev *dev) > return dev - rte_eth_devices; > } > > +int32_t > +eth_check_err(struct rte_eth_dev *dev, int ret) > +{ > + if (ret == 0) > + return 0; > + > + if (rte_eth_dev_is_removed(eth_dev_to_id(dev))) > + return -EIO; > + > + return ret; > +} It still duplicates eth_err(). I realize the difference in the first argument, but I think it is better to stick to eth_err(). Anyway eth_check_err() gets port_id by device and it is the only usage of the device in the function. [snip]