From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id 75B3F5587 for ; Thu, 24 Nov 2016 10:59:38 +0100 (CET) Received: from glumotte.dev.6wind.com (unknown [10.16.0.195]) by proxy.6wind.com (Postfix) with ESMTP id 19B8D278AD; Thu, 24 Nov 2016 10:59:34 +0100 (CET) From: Olivier Matz To: dev@dpdk.org Cc: thomas.monjalon@6wind.com, konstantin.ananyev@intel.com, wenzhuo.lu@intel.com, helin.zhang@intel.com Date: Thu, 24 Nov 2016 10:54:15 +0100 Message-Id: <1479981261-19512-4-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1479981261-19512-1-git-send-email-olivier.matz@6wind.com> References: <1479981261-19512-1-git-send-email-olivier.matz@6wind.com> Subject: [dpdk-dev] [RFC 3/9] ethdev: add handler for Tx queue descriptor count X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 24 Nov 2016 09:59:38 -0000 Implement the Tx counterpart of rte_eth_rx_queue_count() in ethdev API, which returns the number of used descriptors in a Tx queue. It can help an application to detect that a link is too slow and cannot send at the desired rate. In this case, the application can decide to decrease the rate, or drop the packets with the lowest priority. PR=52423 Signed-off-by: Olivier Matz Acked-by: Ivan Boule --- lib/librte_ether/rte_ethdev.h | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 9551cfd..8244807 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -1147,6 +1147,10 @@ typedef uint32_t (*eth_rx_queue_count_t)(struct rte_eth_dev *dev, uint16_t rx_queue_id); /**< @internal Get number of used descriptors on a receive queue. */ +typedef uint32_t (*eth_tx_queue_count_t)(struct rte_eth_dev *dev, + uint16_t tx_queue_id); +/**< @internal Get number of used descriptors on a transmit queue */ + typedef int (*eth_rx_descriptor_done_t)(void *rxq, uint16_t offset); /**< @internal Check DD bit of specific RX descriptor */ @@ -1461,6 +1465,8 @@ struct eth_dev_ops { eth_queue_release_t rx_queue_release;/**< Release RX queue.*/ eth_rx_queue_count_t rx_queue_count; /**< Get the number of used RX descriptors. */ + eth_tx_queue_count_t tx_queue_count; + /**< Get the number of used TX descriptors. */ eth_rx_descriptor_done_t rx_descriptor_done; /**< Check rxd DD bit */ /**< Enable Rx queue interrupt. */ eth_rx_enable_intr_t rx_queue_intr_enable; @@ -2710,6 +2716,31 @@ rte_eth_rx_queue_count(uint8_t port_id, uint16_t queue_id) } /** + * Get the number of used descriptors of a tx queue + * + * @param port_id + * The port identifier of the Ethernet device. + * @param queue_id + * The queue id on the specific port. + * @return + * - number of free descriptors if positive or zero + * - (-EINVAL) if *port_id* or *queue_id* is invalid. + * - (-ENOTSUP) if the device does not support this function + */ +static inline int +rte_eth_tx_queue_count(uint8_t port_id, uint16_t queue_id) +{ + struct rte_eth_dev *dev = &rte_eth_devices[port_id]; + + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_count, -ENOTSUP); + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL); + if (queue_id >= dev->data->nb_tx_queues) + return -EINVAL; + + return (*dev->dev_ops->tx_queue_count)(dev, queue_id); +} + +/** * Check if the DD bit of the specific RX descriptor in the queue has been set * * @param port_id -- 2.8.1