From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 39E18A09FF; Mon, 28 Dec 2020 12:01:01 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 154C0C9E0; Mon, 28 Dec 2020 12:01:00 +0100 (CET) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by dpdk.org (Postfix) with ESMTP id 22004C9D6 for ; Mon, 28 Dec 2020 12:00:57 +0100 (CET) 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 (2048 bits) server-digest SHA256) (No client certificate requested) by shelob.oktetlabs.ru (Postfix) with ESMTPSA id BAA557F527; Mon, 28 Dec 2020 14:00:55 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru BAA557F527 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=oktetlabs.ru; s=default; t=1609153255; bh=XsrBcc8ROtZ9bYtLCYGpZd71oojLrsCNwWIpVP13VCA=; h=Subject:To:Cc:References:From:Date:In-Reply-To; b=DpSYFkVadbosnKoAZKEpkpOqGiZaYKqIxG072RwA+vWN4Zt998BZFunKEqopgIPv2 cMswVGK0g1iQ/tknGE3ESNdk8nrzKWA/j6cx9Z4CwjnlUlGR53XVf8wpmkPSvX5X+C o0A+Un8RRihybAwM4vBElHkCjrX79kE0ZViPM108= To: Anatoly Burakov , dev@dpdk.org Cc: Liang Ma , Thomas Monjalon , Ferruh Yigit , Ray Kinsella , Neil Horman , konstantin.ananyev@intel.com, gage.eads@intel.com, timothy.mcdaniel@intel.com, david.hunt@intel.com, bruce.richardson@intel.com, chris.macnamara@intel.com References: <8f06ba8347a3b464eba41ee4985b83934422c89a.1608213657.git.anatoly.burakov@intel.com> From: Andrew Rybchenko Organization: OKTET Labs Message-ID: <01cc4862-244f-74b8-b482-6b7b08549d01@oktetlabs.ru> Date: Mon, 28 Dec 2020 14:00:55 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.5.1 MIME-Version: 1.0 In-Reply-To: <8f06ba8347a3b464eba41ee4985b83934422c89a.1608213657.git.anatoly.burakov@intel.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Subject: Re: [dpdk-dev] [PATCH v12 06/11] ethdev: add simple power management API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On 12/17/20 5:05 PM, Anatoly Burakov wrote: > From: Liang Ma > > 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 > Signed-off-by: Anatoly Burakov > Acked-by: Konstantin Ananyev > --- > > Notes: > v6: > - Rebase on top of latest main > - Ensure the API checks queue ID (Konstantin) > - Removed accidental inclusion of unrelated release notes > v5: > - Bring function format in line with other functions in the file > - Ensure the API is supported by the driver before calling it (Konstantin) > > doc/guides/rel_notes/release_21_02.rst | 4 ++++ > lib/librte_ethdev/rte_ethdev.c | 28 ++++++++++++++++++++++++++ > lib/librte_ethdev/rte_ethdev.h | 25 +++++++++++++++++++++++ > lib/librte_ethdev/rte_ethdev_driver.h | 22 ++++++++++++++++++++ > lib/librte_ethdev/version.map | 3 +++ > 5 files changed, 82 insertions(+) > > diff --git a/doc/guides/rel_notes/release_21_02.rst b/doc/guides/rel_notes/release_21_02.rst > index 638f98168b..feb3ff4f06 100644 > --- a/doc/guides/rel_notes/release_21_02.rst > +++ b/doc/guides/rel_notes/release_21_02.rst > @@ -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. > > 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 > + 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 > #include > #include > +#include > > #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 > + * > + * @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 > }; > > /** > 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 { >