On 28-Dec-20 11:00 AM, Andrew Rybchenko wrote:
On 12/17/20 5:05 PM, Anatoly Burakov wrote:
From: Liang Ma <liang.j...@intel.com>

Add a simple API to allow getting the monitor conditions for
power-optimized monitoring of the RX queues from the PMD, as well as
release notes information.

Signed-off-by: Liang Ma <liang.j...@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.bura...@intel.com>
Acked-by: Konstantin Ananyev <konstantin.anan...@intel.com>
---

Hi Andrew,

Thanks for your review!

@@ -55,6 +55,10 @@ New Features
       Also, make sure to start the actual text at the margin.
       =======================================================
+* **ethdev: added 1 new API for PMD power management**

"1 new API" sounds a bit confusing. May be just "a new API"?

+
+  * ``rte_eth_get_monitor_addr()``, to be used in conjunction with
+    ``rte_power_monitor()`` to enable automatic power management for PMD's.

Missing extra empty line here.


Will fix.

Removed Items
  -------------
diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
index 17ddacc78d..58f68321ea 100644
--- a/lib/librte_ethdev/rte_ethdev.c
+++ b/lib/librte_ethdev/rte_ethdev.c
@@ -5115,6 +5115,34 @@ rte_eth_tx_burst_mode_get(uint16_t port_id, uint16_t 
queue_id,
                       dev->dev_ops->tx_burst_mode_get(dev, queue_id, mode));
  }
+int
+rte_eth_get_monitor_addr(uint16_t port_id, uint16_t queue_id,
+               struct rte_power_monitor_cond *pmc)
+{
+       struct rte_eth_dev *dev;
+
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+
+       dev = &rte_eth_devices[port_id];
+
+       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->get_monitor_addr, -ENOTSUP);
+
+       if (queue_id >= dev->data->nb_tx_queues) {
+               RTE_ETHDEV_LOG(ERR, "Invalid TX queue_id=%u\n", queue_id);

Why is Tx queue checked and logged here, but Rx queue is used
below? I guess Rx should be used here as well.

I.e. TX -> Rx


Yep, fixed already.

+               return -EINVAL;
+       }
+
+       if (pmc == NULL) {
+               RTE_ETHDEV_LOG(ERR, "Invalid power monitor condition=%p\n",
+                               pmc);
+               return -EINVAL;
+       }
+
+       return eth_err(port_id,
+               dev->dev_ops->get_monitor_addr(dev->data->rx_queues[queue_id],
+                       pmc));
+}
+
  int
  rte_eth_dev_set_mc_addr_list(uint16_t port_id,
                             struct rte_ether_addr *mc_addr_set,
diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
index f5f8919186..ca0f91312e 100644
--- a/lib/librte_ethdev/rte_ethdev.h
+++ b/lib/librte_ethdev/rte_ethdev.h
@@ -157,6 +157,7 @@ extern "C" {
  #include <rte_common.h>
  #include <rte_config.h>
  #include <rte_ether.h>
+#include <rte_power_intrinsics.h>
#include "rte_ethdev_trace_fp.h"
  #include "rte_dev_info.h"
@@ -4334,6 +4335,30 @@ __rte_experimental
  int rte_eth_tx_burst_mode_get(uint16_t port_id, uint16_t queue_id,
        struct rte_eth_burst_mode *mode);
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ *
+ * Retrieve the monitor condition for a given receive queue.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The Rx queue on the Ethernet device for which information
+ *   will be retrieved.
+ * @param pmc
+ *   The pointer point to power-optimized monitoring condition structure.
+ *
+ * @return
+ *   - 0: Success.
+ *   -ENOTSUP: Operation not supported.
+ *   -EINVAL: Invalid parameters.
+ *   -ENODEV: Invalid port ID.
+ */
+__rte_experimental
+int rte_eth_get_monitor_addr(uint16_t port_id, uint16_t queue_id,
+               struct rte_power_monitor_cond *pmc);
+
  /**
   * Retrieve device registers and register attributes (number of registers and
   * register size)
diff --git a/lib/librte_ethdev/rte_ethdev_driver.h 
b/lib/librte_ethdev/rte_ethdev_driver.h
index 0eacfd8425..ae4f152cf0 100644
--- a/lib/librte_ethdev/rte_ethdev_driver.h
+++ b/lib/librte_ethdev/rte_ethdev_driver.h
@@ -763,6 +763,26 @@ typedef int (*eth_hairpin_queue_peer_unbind_t)
        (struct rte_eth_dev *dev, uint16_t cur_queue, uint32_t direction);
  /**< @internal Unbind peer queue from the current queue. */
+/**
+ * @internal
+ * Get address of memory location whose contents will change whenever there is
+ * new data to be received on an RX queue.

RX -> Rx


Will fix.

+ *
+ * @param rxq
+ *   Ethdev queue pointer.
+ * @param pmc
+ *   The pointer to power-optimized monitoring condition structure.
+ * @return
+ *   Negative errno value on error, 0 on success.
+ *
+ * @retval 0
+ *   Success
+ * @retval -EINVAL
+ *   Invalid parameters
+ */
+typedef int (*eth_get_monitor_addr_t)(void *rxq,
+               struct rte_power_monitor_cond *pmc);
+
  /**
   * @internal A structure containing the functions exported by an Ethernet 
driver.
   */
@@ -917,6 +937,8 @@ struct eth_dev_ops {
        /**< Set up the connection between the pair of hairpin queues. */
        eth_hairpin_queue_peer_unbind_t hairpin_queue_peer_unbind;
        /**< Disconnect the hairpin queues of a pair from each other. */
+       eth_get_monitor_addr_t get_monitor_addr;
+       /**< Get next RX queue ring entry address. */

RX -> Rx


Will fix.

  };
/**
diff --git a/lib/librte_ethdev/version.map b/lib/librte_ethdev/version.map
index d3f5410806..a124e1e370 100644
--- a/lib/librte_ethdev/version.map
+++ b/lib/librte_ethdev/version.map
@@ -240,6 +240,9 @@ EXPERIMENTAL {
        rte_flow_get_restore_info;
        rte_flow_tunnel_action_decap_release;
        rte_flow_tunnel_item_release;
+
+       # added in 21.02
+       rte_eth_get_monitor_addr;
  };
INTERNAL {




--
Thanks,
Anatoly

Reply via email to