From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id AD3314241E; Thu, 19 Jan 2023 17:47:41 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9E4F440223; Thu, 19 Jan 2023 17:47:41 +0100 (CET) Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2077.outbound.protection.outlook.com [40.107.244.77]) by mails.dpdk.org (Postfix) with ESMTP id 88541400D5 for ; Thu, 19 Jan 2023 17:47:40 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=gneOxLr9sjI7aVh9nN0qs/PyXXX8t6EQE1o/UWDCTt37cKDK69yoP9HU0nK202ehMqs34igLt52Atqua6JJVXsSCmx1r3+OSMhSOTNtVVty7JFvBcJb0lVFybl7qgmW5Xdod7ap+ZdVTyCMAUCvcOryI0OGAcENGp5hKxiQL5Ri+sG7kZdGsvbA8YLwlVNJZkNbfDJmWgjHQNH7RriJuhnJ8oZ3fcH7XXVUY1MUU1zhnv26C4r6XZFu/c/+89+4au23Yfbl3uO2JTs3nEB5OepysxmNOiW5ZAbyILffYmxRwqGSQiJuhJJtZSvRl7E6rlWetR2Iy27QPyJMjyPk/Vw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=yS4YkQo14uWyia6QWJK+eHF2Zuiu/a70LGKRPv5RfGI=; b=fu1sPT1NbHmhFhJZnWFiP3Ca3L+3QGTiRSbc0pZx8ugPBkvgSH7Nyj2Nfs9J1byh+DFOrqfu4NQ/3WYgq6DMv4oc1PSrZ87z3+NPj4o4vW39tFv9Z+ntA0MojAy2wQk0E8kxmYUUCcOcWxmYMzENO0N0IQfov6EMESIQcgj+fP4mM2hWYPYE2NRfpJsEKjPt4+fmHndxs2PCiJ+VfO52uAqDUINI3368+7Jsr205d2eafqlMo1/CCtEDPYb1KYV9FYVPG9iZ1Obq7ONuwASXQ7nNFcFNUt+bbFm5ou4iT1DNy463LRlExCLCqtF5wyPtm8L2yEIBIfGeeOnbUEgrLw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=dpdk.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=yS4YkQo14uWyia6QWJK+eHF2Zuiu/a70LGKRPv5RfGI=; b=XUDkE1xs7Dtaj1jVXLmOkP64Fs9CM8LZyM0A56Hx/7f1uFC1qlGY93HpUEqHnmnVnioL+H0dI8MyrR8Fi01H1bkxHLdMzrKFe7S+ImdmQrPpqrD9uO47tzMlbK4pN2FiT/uReY3xcCPPZcEHIkSgiji8V7LxL10C2LwWPgb4s2V0aEIeoUxekKxBG77rzLc60gXCGRO5L+bRgKqG92VpDWfhqJC5VAQiA01QEz4wuglcT8j4TuZrfu7h73vCoWBMn9fSI+LMhe1OqH2hrv+u6b96yagVg7rXe6rfItPpOF2A8SjjjYZNrPtsUpcRUGjWREEB/dUM+t0pxpYZy+8sdQ== Received: from BN8PR07CA0024.namprd07.prod.outlook.com (2603:10b6:408:ac::37) by PH0PR12MB7984.namprd12.prod.outlook.com (2603:10b6:510:26f::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6002.24; Thu, 19 Jan 2023 16:47:38 +0000 Received: from BN8NAM11FT054.eop-nam11.prod.protection.outlook.com (2603:10b6:408:ac:cafe::16) by BN8PR07CA0024.outlook.office365.com (2603:10b6:408:ac::37) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6002.26 via Frontend Transport; Thu, 19 Jan 2023 16:47:38 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by BN8NAM11FT054.mail.protection.outlook.com (10.13.177.102) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6023.16 via Frontend Transport; Thu, 19 Jan 2023 16:47:37 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.36; Thu, 19 Jan 2023 08:47:29 -0800 Received: from nvidia.com (10.126.230.37) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.36; Thu, 19 Jan 2023 08:47:26 -0800 From: Gregory Etelson To: CC: , , , Ori Kam , Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko Subject: [PATCH v6 1/2] ethdev: add query_update sync and async function calls Date: Thu, 19 Jan 2023 18:47:12 +0200 Message-ID: <20230119164713.7164-1-getelson@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221221073547.988-1-getelson@nvidia.com> References: <20221221073547.988-1-getelson@nvidia.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.126.230.37] X-ClientProxiedBy: rnnvmail202.nvidia.com (10.129.68.7) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN8NAM11FT054:EE_|PH0PR12MB7984:EE_ X-MS-Office365-Filtering-Correlation-Id: a1ead73a-e8ba-41f7-7240-08dafa3cdf6d X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: D6aukSDaVHLWDobl+PsBNJ4ojPLLyOxOE9iklXH0Jo7R73bgNaAK44Tp6I1LaxOH2DnNh6LId3m3H2eFz6Yv14CC2VF9YRCwh+tooEePB99BwH4BFBNUIRy9J+SyGIzuACIitV9doB1kG5KCqyyRyUK108PlzAn0jGhjnVl50LKRVPGuCP133YNX3DjreGWVWI5lkF5/bGeMOCd6bYftrCnTzXaJskiA7hCy1GOrJpcXWr1ACR6wV7DN1m75eZo4X+2kGxXBAL/h89qG4M8HXe1pxq7OjviAOJDHxso9z7equnPcOfp/Qagw2eNHo/2eSU6oMMnYQBooR1aTYGK1ppoNeAAXW7nly6DrQDE+/d7cQQlvEk3B/cm594JsQpb1m8IljqolGtK3zsDoWV5g+Fo0oU88M3Tjrb1V0QdE9nE5DmFrUAiU1APjbTRSFhoCSWqr7MHLf79KXwe9bY1/i0Ua2kYlk5NrEZuRBwAXIW3Sc1Qhib84eLxxPLK4BfemTL3HQA6A3zNMxxqx+AzVdn3KFFbqB9fSrdQZ59bv0wrxT1LBfS5dVW3xnQmEd2Rzqq2kWrCWPoHevoqrR9v1DHks9CxLkC+tE/9vyAl4MfRorla8yc8hN9PK/HL4zgDNxxfVR6dEM+do9ZtxOVsZh/zQfXRlQZL+Wc3KiUp0LtHu+6Dd83NAhqNGAsNlEYaHGeMY6O81vATFVir66uAl/A== X-Forefront-Antispam-Report: CIP:216.228.117.160; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge1.nvidia.com; CAT:NONE; SFS:(13230022)(4636009)(39860400002)(396003)(136003)(346002)(376002)(451199015)(36840700001)(46966006)(40470700004)(7636003)(36860700001)(82740400003)(70586007)(356005)(8936002)(5660300002)(2906002)(55016003)(70206006)(4326008)(8676002)(40480700001)(6916009)(41300700001)(1076003)(26005)(40460700003)(2616005)(82310400005)(16526019)(186003)(336012)(6286002)(83380400001)(6666004)(426003)(47076005)(316002)(54906003)(7696005)(478600001)(86362001)(36756003); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jan 2023 16:47:37.7788 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a1ead73a-e8ba-41f7-7240-08dafa3cdf6d X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.160]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN8NAM11FT054.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB7984 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 Current API allows either query or update indirect flow action. If indirect action must be conditionally updated according to it's present state application must first issue action query then analyze returned data and if needed issue update request. When the update will be processed, action state can change and the update can invalidate the action. The patch adds `rte_flow_action_handle_query_update` function call, and it's async version `rte_flow_async_action_handle_query_update` to atomically query and update flow action. Application can control query and update order, if that is supported by port hardware, by setting `qu_mode` parameter to RTE_FLOW_QU_QUERY_FIRST or RTE_FLOW_QU_UPDATE_FIRST. Signed-off-by: Gregory Etelson --- v2: Remove RTE_FLOW_QU_DEFAULT query-update mode. v3: Update release release notes. Fix doxygen errors. v4: Add returned errno codes. v5: Update the patch description. Fix typos. v6: Resolve merge conflict with the main branch. --- doc/guides/rel_notes/release_23_03.rst | 7 ++ lib/ethdev/rte_flow.c | 39 ++++++++++ lib/ethdev/rte_flow.h | 99 ++++++++++++++++++++++++++ lib/ethdev/rte_flow_driver.h | 15 ++++ lib/ethdev/version.map | 5 ++ 5 files changed, 165 insertions(+) diff --git a/doc/guides/rel_notes/release_23_03.rst b/doc/guides/rel_notes/release_23_03.rst index c15f6fbb9f..6941d20abc 100644 --- a/doc/guides/rel_notes/release_23_03.rst +++ b/doc/guides/rel_notes/release_23_03.rst @@ -69,6 +69,13 @@ New Features ``rte_event_dev_config::nb_single_link_event_port_queues`` parameter required for eth_rx, eth_tx, crypto and timer eventdev adapters. +* **Added functions to atomically query and update indirect flow action.** + + Added synchronous and asynchronous functions to atomically query and update + indirect flow action: + + - ``rte_flow_action_handle_query_update`` + - ``rte_flow_async_action_handle_query_update`` Removed Items ------------- diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c index 7d0c24366c..8b8aa940be 100644 --- a/lib/ethdev/rte_flow.c +++ b/lib/ethdev/rte_flow.c @@ -1883,3 +1883,42 @@ rte_flow_async_action_handle_query(uint16_t port_id, action_handle, data, user_data, error); return flow_err(port_id, ret, error); } + +int +rte_flow_action_handle_query_update(uint16_t port_id, + struct rte_flow_action_handle *handle, + const void *update, void *query, + enum rte_flow_query_update_mode mode, + struct rte_flow_error *error) +{ + struct rte_eth_dev *dev = &rte_eth_devices[port_id]; + const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error); + int ret; + + if (!ops || !ops->action_handle_query_update) + return -ENOTSUP; + ret = ops->action_handle_query_update(dev, handle, update, query, + mode, error); + return flow_err(port_id, ret, error); +} + +int +rte_flow_async_action_handle_query_update(uint16_t port_id, uint32_t queue_id, + const struct rte_flow_op_attr *attr, + struct rte_flow_action_handle *handle, + const void *update, void *query, + enum rte_flow_query_update_mode mode, + void *user_data, + struct rte_flow_error *error) +{ + struct rte_eth_dev *dev = &rte_eth_devices[port_id]; + const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error); + int ret; + + if (!ops || !ops->async_action_handle_query_update) + return -ENOTSUP; + ret = ops->async_action_handle_query_update(dev, queue_id, attr, + handle, update, query, mode, + user_data, error); + return flow_err(port_id, ret, error); +} diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h index b60987db4b..280567a3ae 100644 --- a/lib/ethdev/rte_flow.h +++ b/lib/ethdev/rte_flow.h @@ -5622,6 +5622,105 @@ rte_flow_async_action_handle_query(uint16_t port_id, void *user_data, struct rte_flow_error *error); +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Query_update operational mode. + * + * RTE_FLOW_QU_QUERY_FIRST + * Force port to query action before update. + * RTE_FLOW_QU_UPDATE_FIRST + * Force port to update action before query. + * + * @see rte_flow_action_handle_query_update() + * @see rte_flow_async_action_handle_query_update() + */ +enum rte_flow_query_update_mode { + RTE_FLOW_QU_QUERY_FIRST, /* query before update */ + RTE_FLOW_QU_UPDATE_FIRST, /* query after update */ +}; + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Query and/or update indirect flow action. + * If update parameter is NULL the function queries indirect action. + * If query parameter is NULL the function updates indirect action. + * If both query and update not NULL, the function atomically + * queries and updates indirect action. Query and update are carried in order + * specified in the mode parameter. + * + * @param port_id + * Port identifier of Ethernet device. + * @param handle + * Handle for the indirect action object to be updated. + * @param update + * Update profile specification used to modify the action pointed by handle. + * @param query + * Pointer to storage for the associated query data type. + * @param mode + * Operational mode. + * @param error + * Perform verbose error reporting if not NULL. + * PMDs initialize this structure in case of error only. + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + * - (ENOTSUP) if underlying device does not support this functionality. + * - (EINVAL) - if *handle* invalid + */ +__rte_experimental +int +rte_flow_action_handle_query_update(uint16_t port_id, + struct rte_flow_action_handle *handle, + const void *update, void *query, + enum rte_flow_query_update_mode mode, + struct rte_flow_error *error); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Enqueue async indirect flow action query and/or update + * + * @param port_id + * Port identifier of Ethernet device. + * @param queue_id + * Flow queue which is used to update the rule. + * @param attr + * Indirect action update operation attributes. + * @param handle + * Handle for the indirect action object to be updated. + * @param update + * Update profile specification used to modify the action pointed by handle. + * @param query + * Pointer to storage for the associated query data type. + * Query result returned on async completion event. + * @param mode + * Operational mode. + * @param user_data + * The user data that will be returned on async completion event. + * @param error + * Perform verbose error reporting if not NULL. + * PMDs initialize this structure in case of error only. + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + * - (ENOTSUP) if underlying device does not support this functionality. + * - (EINVAL) - if *handle* invalid + */ +__rte_experimental +int +rte_flow_async_action_handle_query_update(uint16_t port_id, uint32_t queue_id, + const struct rte_flow_op_attr *attr, + struct rte_flow_action_handle *handle, + const void *update, void *query, + enum rte_flow_query_update_mode mode, + void *user_data, + struct rte_flow_error *error); + #ifdef __cplusplus } #endif diff --git a/lib/ethdev/rte_flow_driver.h b/lib/ethdev/rte_flow_driver.h index c7d0699c91..7358c10a7a 100644 --- a/lib/ethdev/rte_flow_driver.h +++ b/lib/ethdev/rte_flow_driver.h @@ -114,6 +114,13 @@ struct rte_flow_ops { const struct rte_flow_action_handle *handle, void *data, struct rte_flow_error *error); + /** See rte_flow_action_handle_query_update() */ + int (*action_handle_query_update) + (struct rte_eth_dev *dev, + struct rte_flow_action_handle *handle, + const void *update, void *query, + enum rte_flow_query_update_mode qu_mode, + struct rte_flow_error *error); /** See rte_flow_tunnel_decap_set() */ int (*tunnel_decap_set) (struct rte_eth_dev *dev, @@ -276,6 +283,14 @@ struct rte_flow_ops { void *data, void *user_data, struct rte_flow_error *error); + /** See rte_flow_async_action_handle_query_update */ + int (*async_action_handle_query_update) + (struct rte_eth_dev *dev, uint32_t queue_id, + const struct rte_flow_op_attr *op_attr, + struct rte_flow_action_handle *action_handle, + const void *update, void *query, + enum rte_flow_query_update_mode qu_mode, + void *user_data, struct rte_flow_error *error); }; /** diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map index 17201fbe0f..628c486081 100644 --- a/lib/ethdev/version.map +++ b/lib/ethdev/version.map @@ -298,6 +298,11 @@ EXPERIMENTAL { rte_flow_get_q_aged_flows; rte_mtr_meter_policy_get; rte_mtr_meter_profile_get; + + # added in 23.03 + rte_flow_action_handle_query_update; + rte_flow_async_action_handle_query_update; + }; INTERNAL { -- 2.34.1