From patchwork Wed Jul 13 13:03:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerin Jacob X-Patchwork-Id: 113943 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 10005A0032; Wed, 13 Jul 2022 15:06:21 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8D00B4282D; Wed, 13 Jul 2022 15:06:20 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id 65F2E4280D for ; Wed, 13 Jul 2022 15:06:18 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 26D4L44e006813; Wed, 13 Jul 2022 06:05:58 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=y2r7dLAS/LhuK65F+PHziql17HxiyzGwvfxCfvVCLcQ=; b=j4QHHNVHgYtxwyepno+aMu4db2wPPAF6SoNVE+x/tuosyfoQt8p7hUKViO9mHp97BccX GVTtwiyKuQ9DDOcR4K537XxUtgnCiuBSki9ur9M6msU5GrjnDZy3sIKrPW/7DueuslNp 1U6ws3sZ82z9tvyFCTEpZWi8HarxZN3ZRcke15Bu9yakLjXkX9ryI1Ota2E4I6WMHDJ/ 3L/bmZW4qVAbia8homusLl4KVUoQIygK4Q7Ioe4om7d2kEpFox2GskM9itrXXUONtUD+ vCGFODUROw0EeMKHyWuv+u5O1WslyVV+VgO2GBT640ODCDVaJViGJb/8FS5K7lNl8uW7 1g== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3h9d0mbqbs-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Wed, 13 Jul 2022 06:05:58 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 13 Jul 2022 06:05:55 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.18 via Frontend Transport; Wed, 13 Jul 2022 06:05:55 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 95C8E3F704F; Wed, 13 Jul 2022 06:05:30 -0700 (PDT) From: To: , Ferruh Yigit , Thomas Monjalon , Andrew Rybchenko CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Jerin Jacob Subject: [dpdk-dev] [PATCH v1] ethdev: support congestion management Date: Wed, 13 Jul 2022 18:33:39 +0530 Message-ID: <20220713130340.2886839-1-jerinj@marvell.com> X-Mailer: git-send-email 2.37.0 In-Reply-To: <20220530131526.3598658-1-jerinj@marvell.com> References: <20220530131526.3598658-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-GUID: hsN0lik8jhoakp2cB4Yaq5UK_9jiOPFj X-Proofpoint-ORIG-GUID: hsN0lik8jhoakp2cB4Yaq5UK_9jiOPFj X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-07-13_01,2022-07-13_02,2022-06-22_01 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 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 RTE_ETH_CMAN_OBJ_RX_QUEUE, RTE_ETH_CMAN_OBJ_RX_QUEUE_MEMPOOL object. Introduced reserved fields in configuration structure 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 supported modes and objects. Added rte_eth_cman_config_init(), rte_eth_cman_config_set() APIs to configure congestion management on those object with associated mode. Finally, Added rte_eth_cman_config_get() API to retrieve the applied configuration. Signed-off-by: Jerin Jacob --- 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 + lib/eal/include/meson.build | 1 + lib/eal/include/rte_cman.h | 52 ++++++++++ lib/ethdev/rte_ethdev.h | 145 +++++++++++++++++++++++++++ 5 files changed, 211 insertions(+) create mode 100644 lib/eal/include/rte_cman.h diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst index 7f6cb914a5..aa22d8bb22 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 d1db0c256a..38a5767b06 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/lib/eal/include/meson.build b/lib/eal/include/meson.build index fd6e844224..e569ba7cf4 100644 --- a/lib/eal/include/meson.build +++ b/lib/eal/include/meson.build @@ -10,6 +10,7 @@ headers += files( 'rte_branch_prediction.h', 'rte_bus.h', 'rte_class.h', + 'rte_cman.h', 'rte_common.h', 'rte_compat.h', 'rte_debug.h', diff --git a/lib/eal/include/rte_cman.h b/lib/eal/include/rte_cman.h new file mode 100644 index 0000000000..e50dd28bc4 --- /dev/null +++ b/lib/eal/include/rte_cman.h @@ -0,0 +1,52 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2022 Marvell International Ltd. + */ + +#ifndef RTE_CMAN_H +#define RTE_CMAN_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * @file + * Congestion management related parameters for DPDK. + */ + +/** Congestion management modes */ +enum rte_cman_mode { + /** Congestion based on Random Early Detection. + * + * https://en.wikipedia.org/wiki/Random_early_detection + * http://www.aciri.org/floyd/papers/red/red.html + * @see struct rte_cman_red_params + */ + RTE_CMAN_RED = RTE_BIT64(0), +}; + +/** + * RED based congestion management configuration parameters. + */ +struct rte_cman_red_params { + /** Minimum threshold (min_th) value + * + * Value expressed as percentage. Value must be in 0 to 100(inclusive). + */ + uint8_t min_th; + /** Maximum threshold (max_th) value + * + * Value expressed as percentage. Value must be in 0 to 100(inclusive). + */ + uint8_t max_th; + /** Inverse of packet marking probability maximum value (maxp = 1 / maxp_inv) */ + uint16_t maxp_inv; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* RTE_CMAN_H */ diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h index de9e970d4d..6a342df64a 100644 --- a/lib/ethdev/rte_ethdev.h +++ b/lib/ethdev/rte_ethdev.h @@ -160,6 +160,7 @@ extern "C" { #define RTE_ETHDEV_DEBUG_TX #endif +#include #include #include #include @@ -5506,6 +5507,150 @@ typedef struct { __rte_experimental int rte_eth_dev_priv_dump(uint16_t port_id, FILE *file); +/* Congestion management */ + +/** Enumerate list of ethdev congestion management objects */ +enum rte_eth_cman_obj { + /** Congestion management based on Rx queue depth */ + RTE_ETH_CMAN_OBJ_RX_QUEUE = RTE_BIT64(0), + /** Congestion management based on mempool depth associated with Rx queue + * @see rte_eth_rx_queue_setup() + */ + RTE_ETH_CMAN_OBJ_RX_QUEUE_MEMPOOL = RTE_BIT64(1), +}; + +/** + * @warning + * @b EXPERIMENTAL: this structure may change, or be removed, without prior notice + * + * A structure used to retrieve information of ethdev congestion management. + */ +struct rte_eth_cman_info { + /** Set of supported congestion management modes + * @see enum rte_cman_mode + */ + uint64_t modes_supported; + /** Set of supported congestion management objects + * @see enum rte_eth_cman_obj + */ + uint64_t objs_supported; + /** Reserved for future fields */ + uint8_t rsvd[64]; +}; + +/** + * @warning + * @b EXPERIMENTAL: this structure may change, or be removed, without prior notice + * + * A structure used to configure the ethdev congestion management. + */ +struct rte_eth_cman_config { + /** Congestion management object */ + enum rte_eth_cman_obj obj; + /** Congestion management mode */ + enum rte_cman_mode mode; + union { + /** Rx queue to configure congestion management. + * + * Valid when object is RTE_ETH_CMAN_OBJ_RX_QUEUE or + * RTE_ETH_CMAN_OBJ_RX_QUEUE_MEMPOOL. + */ + uint16_t rx_queue; + /** Reserved for future fields */ + uint8_t rsvd_obj_params[16]; + } obj_param; + union { + /** RED configuration parameters. + * + * Valid when mode is RTE_CMAN_RED. + */ + struct rte_cman_red_params red; + /** Reserved for future fields */ + uint8_t rsvd_mode_params[64]; + } mode_param; +}; + +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Retrieve the information for ethdev congestion management + * + * @param port_id + * The port identifier of the Ethernet device. + * @param info + * A pointer to a structure of type *rte_eth_cman_info* to be filled with + * the information about congestion management. + * @return + * - (0) if successful. + * - (-ENOTSUP) if support for cman_info_get does not exist. + * - (-ENODEV) if *port_id* invalid. + * - (-EINVAL) if bad parameter. + */ +__rte_experimental +int rte_eth_cman_info_get(uint16_t port_id, struct rte_eth_cman_info *info); + +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Initialize the ethdev congestion management configuration structure with default values. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param config + * A pointer to a structure of type *rte_eth_cman_config* to be initialized + * with default value. + * @return + * - (0) if successful. + * - (-ENODEV) if *port_id* invalid. + * - (-EINVAL) if bad parameter. + */ +__rte_experimental +int rte_eth_cman_config_init(uint16_t port_id, struct rte_eth_cman_config *config); + +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Configure ethdev congestion management + * + * @param port_id + * The port identifier of the Ethernet device. + * @param config + * A pointer to a structure of type *rte_eth_cman_config* to be configured. + * @return + * - (0) if successful. + * - (-ENOTSUP) if support for cman_config_set does not exist. + * - (-ENODEV) if *port_id* invalid. + * - (-EINVAL) if bad parameter. + */ +__rte_experimental +int rte_eth_cman_config_set(uint16_t port_id, struct rte_eth_cman_config *config); + +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Retrieve the applied ethdev congestion management parameters for the given port. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param config + * A pointer to a structure of type *rte_eth_cman_config* to retrieve + * congestion management parameters for the given object. + * Application must fill all parameters except mode_param parameter in + * struct rte_eth_cman_config. + * + * @return + * - (0) if successful. + * - (-ENOTSUP) if support for cman_config_get does not exist. + * - (-ENODEV) if *port_id* invalid. + * - (-EINVAL) if bad parameter. + */ +__rte_experimental +int rte_eth_cman_config_get(uint16_t port_id, struct rte_eth_cman_config *config); + #include /**