From patchwork Tue Aug 6 15:24:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 142967 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 C02D24574E; Tue, 6 Aug 2024 17:25:18 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E992A40E43; Tue, 6 Aug 2024 17:25:13 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) by mails.dpdk.org (Postfix) with ESMTP id A168540E43 for ; Tue, 6 Aug 2024 17:25:11 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1722957912; x=1754493912; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=7flcBQs/VJM0iJc3WGvVe9KsR5jD9Jmdt9YDD5n9rA0=; b=LG4ljGx+DP1TBtS5w1igkjEcoZ6MLgl+t6Pmv/61hU7ArfnbzpyIPsb7 xoPRkbMX4t+t+qB/zSOvxynELLonGJQWEm2U06ZkRkKqDNBy3mzn6ou36 f1ALtOOtUXw0cKpKwF6f062FTMnamX1TtpKXVOyK4Q051GBn9eON+IXx3 ZZMBde7gZC/4jHc9V8izEpMxcn/+ejLYAIEvgULPXox+hn44G9RuDQIeq x2l9hRhGXmV48IgR9US1FUQ7HekyumBMubyqVlyVU17j9a0knwzPUyYsZ +5OMNyRzlGHP/BO0VSJnrf/rN6p3/zoAMx+ZYk17bguoOPSPw9Ez+Kafv A==; X-CSE-ConnectionGUID: aZZ4C8mBQZ+N5cL0FnTjgg== X-CSE-MsgGUID: rm7ltbVfTc+a0JN7CfPawg== X-IronPort-AV: E=McAfee;i="6700,10204,11156"; a="21160527" X-IronPort-AV: E=Sophos;i="6.09,268,1716274800"; d="scan'208";a="21160527" Received: from orviesa008.jf.intel.com ([10.64.159.148]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Aug 2024 08:25:11 -0700 X-CSE-ConnectionGUID: 7WXpZDvZS+6OAsF+yYuc6w== X-CSE-MsgGUID: RasTD5Z9RU690TOqLBcbOA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.09,268,1716274800"; d="scan'208";a="57245522" Received: from silpixa00401385.ir.intel.com ([10.237.214.25]) by orviesa008.jf.intel.com with ESMTP; 06 Aug 2024 08:25:09 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Bruce Richardson , Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko , Cristian Dumitrescu Subject: [PATCH 4/4] ethdev: add traffic manager query function Date: Tue, 6 Aug 2024 16:24:17 +0100 Message-ID: <20240806152417.3649745-5-bruce.richardson@intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240806152417.3649745-1-bruce.richardson@intel.com> References: <20240806152417.3649745-1-bruce.richardson@intel.com> MIME-Version: 1.0 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 Add function to allow querying a node in the scheduler tree. Returns the parameters as were given to the add function. Adding this function allows apps to just query the hierarchy rather than having to maintain their own copies of it internally. Signed-off-by: Bruce Richardson --- lib/ethdev/ethdev_trace.h | 16 +++++++++++ lib/ethdev/ethdev_trace_points.c | 3 ++ lib/ethdev/rte_tm.c | 25 +++++++++++++++++ lib/ethdev/rte_tm.h | 48 ++++++++++++++++++++++++++++++++ lib/ethdev/rte_tm_driver.h | 12 ++++++++ 5 files changed, 104 insertions(+) diff --git a/lib/ethdev/ethdev_trace.h b/lib/ethdev/ethdev_trace.h index 3bec87bfdb..dee2819531 100644 --- a/lib/ethdev/ethdev_trace.h +++ b/lib/ethdev/ethdev_trace.h @@ -1903,6 +1903,22 @@ RTE_TRACE_POINT( rte_trace_point_emit_int(ret); ) +RTE_TRACE_POINT( + rte_tm_trace_node_query, + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t node_id, + uint32_t *parent_node_id, uint32_t *priority, + uint32_t *weight, uint32_t *level_id, + struct rte_tm_node_params *params, int ret), + rte_trace_point_emit_u16(port_id); + rte_trace_point_emit_u32(node_id); + rte_trace_point_emit_ptr(parent_node_id); + rte_trace_point_emit_ptr(priority); + rte_trace_point_emit_ptr(weight); + rte_trace_point_emit_ptr(level_id); + rte_trace_point_emit_ptr(params); + rte_trace_point_emit_int(ret); +) + RTE_TRACE_POINT( rte_tm_trace_node_delete, RTE_TRACE_POINT_ARGS(uint16_t port_id, uint32_t node_id, int ret), diff --git a/lib/ethdev/ethdev_trace_points.c b/lib/ethdev/ethdev_trace_points.c index 99e04f5893..f5ed7ca637 100644 --- a/lib/ethdev/ethdev_trace_points.c +++ b/lib/ethdev/ethdev_trace_points.c @@ -694,6 +694,9 @@ RTE_TRACE_POINT_REGISTER(rte_tm_trace_mark_vlan_dei, RTE_TRACE_POINT_REGISTER(rte_tm_trace_node_add, lib.ethdev.tm.node_add) +RTE_TRACE_POINT_REGISTER(rte_tm_trace_node_query, + lib.ethdev.tm.node_query) + RTE_TRACE_POINT_REGISTER(rte_tm_trace_node_capabilities_get, lib.ethdev.tm.node_capabilities_get) diff --git a/lib/ethdev/rte_tm.c b/lib/ethdev/rte_tm.c index 3eb98e618a..8000b66af9 100644 --- a/lib/ethdev/rte_tm.c +++ b/lib/ethdev/rte_tm.c @@ -301,6 +301,31 @@ int rte_tm_node_add(uint16_t port_id, return ret; } +int rte_tm_node_query(uint16_t port_id, + uint32_t node_id, + uint32_t *parent_node_id, + uint32_t *priority, + uint32_t *weight, + uint32_t *level_id, + struct rte_tm_node_params *params, + struct rte_tm_error *error) +{ + struct rte_eth_dev *dev = &rte_eth_devices[port_id]; + int ret; + + if (dev == NULL) + return -EINVAL; + + ret = RTE_TM_FUNC(port_id, node_query)(dev, + node_id, parent_node_id, priority, weight, level_id, + params, error); + + rte_tm_trace_node_query(port_id, node_id, parent_node_id, priority, + weight, level_id, params, ret); + + return ret; +} + /* Delete node from traffic manager hierarchy */ int rte_tm_node_delete(uint16_t port_id, uint32_t node_id, diff --git a/lib/ethdev/rte_tm.h b/lib/ethdev/rte_tm.h index e5da9b8323..419e491043 100644 --- a/lib/ethdev/rte_tm.h +++ b/lib/ethdev/rte_tm.h @@ -1599,6 +1599,54 @@ rte_tm_node_add(uint16_t port_id, const struct rte_tm_node_params *params, struct rte_tm_error *error); +/** + * Return information about a traffic management node + * + * Return information about a hierarchy node, using the same format of parameters + * as was passed to the rte_rm_node_add() function. + * Each of the "out" parameters pointers (except error) may be passed as NULL if the + * information is not needed by the caller. For example, to one may check if a node id + * is in use by: + * + * struct rte_tm_error error; + * int ret = rte_tm_node_query(port, node_id, NULL, NULL, NULL, NULL, NULL, &error); + * if (ret == ENOENT) ... + * + * @param[in] port_id + * The port identifier of the Ethernet device. + * @param[in] node_id + * Node ID. Should be a valid node id. + * @param[out] parent_node_id + * Parent node ID. + * @param[out] priority + * Node priority. The highest node priority is zero. Used by the SP algorithm + * running on the parent of the current node for scheduling this child node. + * @param[out] weight + * Node weight. The node weight is relative to the weight sum of all siblings + * that have the same priority. The lowest weight is one. Used by the WFQ + * algorithm running on the parent of the current node for scheduling this + * child node. + * @param[out] level_id + * The node level in the scheduler hierarchy. + * @param[out] params + * Node parameters, as would be used when creating the node. + * @param[out] error + * Error details. Filled in only on error, when not NULL. + * @return + * 0 on success, non-zero error code otherwise. + * -EINVAL - port or node id value is invalid + * -ENOENT - no node exists with the provided id + */ +int +rte_tm_node_query(uint16_t port_id, + uint32_t node_id, + uint32_t *parent_node_id, + uint32_t *priority, + uint32_t *weight, + uint32_t *level_id, + struct rte_tm_node_params *params, + struct rte_tm_error *error); + /** * Traffic manager node delete * diff --git a/lib/ethdev/rte_tm_driver.h b/lib/ethdev/rte_tm_driver.h index 6c2618c0d8..fc67f1cb4b 100644 --- a/lib/ethdev/rte_tm_driver.h +++ b/lib/ethdev/rte_tm_driver.h @@ -119,6 +119,16 @@ typedef int (*rte_tm_node_resume_t)(struct rte_eth_dev *dev, uint32_t node_id, struct rte_tm_error *error); +/** @internal Traffic manager node query */ +typedef int (*rte_tm_node_query_t)(const struct rte_eth_dev *dev, + uint32_t node_id, + uint32_t *parent_node_id, + uint32_t *priority, + uint32_t *weight, + uint32_t *level_id, + struct rte_tm_node_params *params, + struct rte_tm_error *error); + /** @internal Traffic manager hierarchy commit */ typedef int (*rte_tm_hierarchy_commit_t)(struct rte_eth_dev *dev, int clear_on_fail, @@ -248,6 +258,8 @@ struct rte_tm_ops { rte_tm_node_suspend_t node_suspend; /** Traffic manager node resume */ rte_tm_node_resume_t node_resume; + /** Traffic manager node resume */ + rte_tm_node_query_t node_query; /** Traffic manager hierarchy commit */ rte_tm_hierarchy_commit_t hierarchy_commit;