[PATCH v7 1/2] ethdev: add query_update sync and async function calls
Andrew Rybchenko
andrew.rybchenko at oktetlabs.ru
Wed Feb 1 12:16:43 CET 2023
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 <getelson at nvidia.com>
> ---
> 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]
More information about the dev
mailing list