From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by smtp.lore.kernel.org (Postfix) with ESMTP id D76CCC05027 for ; Wed, 1 Feb 2023 11:16:59 +0000 (UTC) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 26BA942D33; Wed, 1 Feb 2023 12:16:45 +0100 (CET) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id 08623406A2 for ; Wed, 1 Feb 2023 12:16:44 +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 (4096 bits)) (No client certificate requested) by shelob.oktetlabs.ru (Postfix) with ESMTPSA id 6B64050; Wed, 1 Feb 2023 14:16:43 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 6B64050 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=oktetlabs.ru; s=default; t=1675250203; bh=xWn6V6Zo+9EOyPwxxHqxaehBFB0x7/xqF2f8A0pn1Qs=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=Qbys1miq6uWvr4iZPGBrUXK5Ni7xgEejEpBlot3uAuM8Ax4eaHD0UA0JrlC8a3TAU POPabKCxDL69+WQAysr+IerMTZukcbJcGegXBNGKYA3ZfEW9aht6sV6FWklTOfFeJ3 zS+TCzKgyOn6vGhtj772sOCeRFX06bhLh9MoI5Ps= Message-ID: Date: Wed, 1 Feb 2023 14:16:43 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.6.0 Subject: Re: [PATCH v7 1/2] ethdev: add query_update sync and async function calls Content-Language: en-US To: Gregory Etelson , dev@dpdk.org Cc: matan@nvidia.com, rasland@nvidia.com, Ori Kam , Thomas Monjalon , Ferruh Yigit References: <20221221073547.988-1-getelson@nvidia.com> <20230124093750.2472-1-getelson@nvidia.com> From: Andrew Rybchenko Organization: OKTET Labs In-Reply-To: <20230124093750.2472-1-getelson@nvidia.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit 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 On 1/24/23 12:37, Gregory Etelson wrote: > 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. > > Add `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. > v7: Update documentation. > --- > doc/guides/rel_notes/release_23_03.rst | 7 ++ > lib/ethdev/rte_flow.c | 45 +++++++++++ > lib/ethdev/rte_flow.h | 103 +++++++++++++++++++++++++ > lib/ethdev/rte_flow_driver.h | 15 ++++ > lib/ethdev/version.map | 5 ++ > 5 files changed, 175 insertions(+) > > diff --git a/doc/guides/rel_notes/release_23_03.rst b/doc/guides/rel_notes/release_23_03.rst > index c15f6fbb9f..5b98e18032 100644 > --- a/doc/guides/rel_notes/release_23_03.rst > +++ b/doc/guides/rel_notes/release_23_03.rst > @@ -68,6 +68,13 @@ New Features > * With this change, the application no longer needs to account for the > ``rte_event_dev_config::nb_single_link_event_port_queues`` parameter > required for eth_rx, eth_tx, crypto and timer eventdev adapters. empty line is required here > +* **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 [snip] > diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h > index b60987db4b..6705cb32af 100644 > --- a/lib/ethdev/rte_flow.h > +++ b/lib/ethdev/rte_flow.h > @@ -5622,6 +5622,109 @@ 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 and 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. Do not duplicate enum members. > + * > + * @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 */ /**< to document enum member /**< Force port to query action before update. */ if it fits line length or before the enum member: /** Force port to query action before update. */ > + RTE_FLOW_QU_UPDATE_FIRST, /* query after update */ same > +}; > + > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Query and/or update indirect flow 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 > + * If not NULL, update profile specification used to modify the action > + * pointed by handle. > + * @param query > + * If not NULL pointer to storage for the associated query data type. > + * @param mode > + * Operational mode. > + * Required if both *update* and *query* are not NULL. > + * @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. > + * - (-ENODEV) if *port_id* invalid. > + * - (-ENOTSUP) if underlying device does not support this functionality. > + * - (-EINVAL) - if *handle* invalid or both *query* and *update* are NULL. Be consistent. You have no '-' before if in two cases above and have in the EINVAL case. > + */ > +__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 > + * If not NULL, update profile specification used to modify the action > + * pointed by handle. > + * @param query > + * If not NULL, pointer to storage for the associated query data type. > + * Query result returned on async completion event. > + * @param mode > + * Operational mode. > + * Required if both *update* and *query* are not NULL. > + * @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. > + * - (-ENODEV) if *port_id* invalid. > + * - (-ENOTSUP) if underlying device does not support this functionality. > + * - (-EINVAL) - if *handle* invalid or both *update* and *query* are NULL. same > + */ > +__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 [snip]