All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
To: Gregory Etelson <getelson@nvidia.com>, dev@dpdk.org
Cc: matan@nvidia.com, rasland@nvidia.com, Ori Kam <orika@nvidia.com>,
	Thomas Monjalon <thomas@monjalon.net>,
	Ferruh Yigit <ferruh.yigit@amd.com>
Subject: Re: [PATCH v8 1/2] ethdev: add query_update sync and async function calls
Date: Thu, 2 Feb 2023 12:15:25 +0300	[thread overview]
Message-ID: <0a24a07c-6d36-2f5e-5f24-1501bcc41c1e@oktetlabs.ru> (raw)
In-Reply-To: <20230201151646.3500-1-getelson@nvidia.com>

query_update is bad for summary, consider something like
ethdev: add query and update sync and async API

On 2/1/23 18:16, 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@nvidia.com>

[snip]

> diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c
> index 7d0c24366c..ece40e7877 100644
> --- a/lib/ethdev/rte_flow.c
> +++ b/lib/ethdev/rte_flow.c
> @@ -1883,3 +1883,48 @@ 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)
> +{
> +	int ret;
> +	struct rte_eth_dev *dev;
> +	const struct rte_flow_ops *ops;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
> +	dev = &rte_eth_devices[port_id];

(-EINVAL) if *handle* invalid or both *query* and *update* are NULL.

must be handled here. It is generic checks and we should do it
in a generic place to avoid duplication in PMD callbacks.

> +	ops = rte_flow_ops_get(port_id, error);
> +	if (!ops || !ops->action_handle_query_update)
> +		return -ENOTSUP;

May be it makes sense to use single-operation callbacks if
another operation input is NULL. I guess it could be
convenient in some cases. Just an idea.

> +	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)
> +{
> +	int ret;
> +	struct rte_eth_dev *dev;
> +	const struct rte_flow_ops *ops;
> +
> +	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
> +	dev = &rte_eth_devices[port_id];

same here

> +	ops = rte_flow_ops_get(port_id, error);
> +	if (!ops || !ops->async_action_handle_query_update)
> +		return -ENOTSUP;

same here

> +	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..d3fbba5b99 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.

I'm sorry, but I strongly dislike enum members duplication
here. I don't understand why we need to duplicate it and why
we can't document it in a right way below.

> + *
> + * @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 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.

It should be a part of generic checks in
rte_flow_action_handle_query_update() implementation.

> + * @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.
> + */
> +__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.

It should be a part of generic checks in
rte_flow_action_handle_query_update() implementation.

> + * @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.
> + */
> +__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]



  parent reply	other threads:[~2023-02-02  9:15 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-21  7:35 [PATCH 1/2] ethdev: add query_update sync and async function calls Gregory Etelson
2022-12-21  7:35 ` [PATCH 2/2] ethdev: add quota flow action and item Gregory Etelson
2023-01-08 13:47   ` Ori Kam
2023-01-04  9:56 ` [PATCH 1/2] ethdev: add query_update sync and async function calls Ori Kam
2023-01-11  9:28   ` Gregory Etelson
2023-01-11  9:22 ` [PATCH v2 " Gregory Etelson
2023-01-11  9:22   ` [PATCH v2 2/2] ethdev: add quota flow action and item Gregory Etelson
2023-01-11 12:20 ` [PATCH v3 1/2] ethdev: add query_update sync and async function calls Gregory Etelson
2023-01-11 12:20   ` [PATCH v3 2/2] ethdev: add quota flow action and item Gregory Etelson
2023-01-18 10:31 ` [PATCH v4 1/2] ethdev: add query_update sync and async function calls Gregory Etelson
2023-01-18 10:31   ` [PATCH v4 2/2] ethdev: add quota flow action and item Gregory Etelson
2023-01-18 14:03     ` Thomas Monjalon
2023-01-19  9:13       ` Gregory Etelson
2023-01-19  9:31         ` Thomas Monjalon
2023-01-19  9:39           ` Gregory Etelson
2023-01-18 13:56   ` [PATCH v4 1/2] ethdev: add query_update sync and async function calls Thomas Monjalon
2023-01-18 17:34     ` Gregory Etelson
2023-01-19  8:44       ` Thomas Monjalon
2023-01-19 13:25 ` [PATCH v5 " Gregory Etelson
2023-01-19 13:25   ` [PATCH v5 2/2] ethdev: add quota flow action and item Gregory Etelson
2023-01-19 16:47 ` [PATCH v6 1/2] ethdev: add query_update sync and async function calls Gregory Etelson
2023-01-19 16:47   ` [PATCH v6 2/2] ethdev: add quota flow action and item Gregory Etelson
2023-01-20  8:52     ` Andrew Rybchenko
2023-01-24  9:26       ` Gregory Etelson
2023-01-20  8:35   ` [PATCH v6 1/2] ethdev: add query_update sync and async function calls Andrew Rybchenko
2023-01-20 10:46     ` Gregory Etelson
2023-01-20 11:22       ` Andrew Rybchenko
2023-01-20 16:50         ` Gregory Etelson
2023-02-01 11:00           ` Andrew Rybchenko
2023-02-01 14:03             ` Gregory Etelson
2023-01-24  9:37 ` [PATCH v7 " Gregory Etelson
2023-01-24  9:37   ` [PATCH v7 2/2] ethdev: add quota flow action and item Gregory Etelson
2023-02-01 11:22     ` Andrew Rybchenko
2023-02-01 15:09       ` Gregory Etelson
2023-02-01 11:16   ` [PATCH v7 1/2] ethdev: add query_update sync and async function calls Andrew Rybchenko
2023-02-01 14:52     ` Gregory Etelson
2023-02-01 15:16 ` [PATCH v8 " Gregory Etelson
2023-02-01 15:16   ` [PATCH v8 2/2] ethdev: add quota flow action and item Gregory Etelson
2023-02-02  9:17     ` Andrew Rybchenko
2023-02-01 17:30   ` [PATCH v8 1/2] ethdev: add query_update sync and async function calls Ori Kam
2023-02-02  9:15   ` Andrew Rybchenko [this message]
2023-02-02 10:24     ` Gregory Etelson
2023-02-02 10:30       ` Andrew Rybchenko
2023-02-02 10:44         ` Gregory Etelson
2023-02-02 10:47           ` Andrew Rybchenko
2023-02-02 11:54 ` [PATCH v9 1/2] ethdev: add query and update " Gregory Etelson
2023-02-02 11:54   ` [PATCH v9 2/2] ethdev: add quota flow action and item Gregory Etelson
2023-02-02 12:13   ` [PATCH v9 1/2] ethdev: add query and update sync and async function calls Andrew Rybchenko
2023-02-09 19:16     ` Gregory Etelson
2023-02-02 13:47 ` [PATCH v10 " Gregory Etelson
2023-02-02 13:47   ` [PATCH v10 2/2] ethdev: add quota flow action and item Gregory Etelson
2023-02-19 17:04     ` Thomas Monjalon
2023-02-07 16:03   ` [PATCH v10 1/2] ethdev: add query and update sync and async function calls Gregory Etelson
2023-02-09 15:13   ` Ferruh Yigit
2023-02-09 16:10     ` Gregory Etelson
2023-02-12 11:13     ` Gregory Etelson
2023-02-13 12:30       ` Gregory Etelson
2023-02-16 15:43   ` Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0a24a07c-6d36-2f5e-5f24-1501bcc41c1e@oktetlabs.ru \
    --to=andrew.rybchenko@oktetlabs.ru \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@amd.com \
    --cc=getelson@nvidia.com \
    --cc=matan@nvidia.com \
    --cc=orika@nvidia.com \
    --cc=rasland@nvidia.com \
    --cc=thomas@monjalon.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.