On 9/29/22 12:35, sk...@marvell.com wrote:
From: Jerin Jacob <jer...@marvell.com>

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 <jer...@marvell.com>
Signed-off-by: Sunil Kumar Kori <sk...@marvell.com>

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]

Reply via email to