20/05/2020 11:18, Andrey Vesnovaty:
> This commit introduces extension of DPDK flow action API enabling
> modification of single rte_flow_action.
> 
> Motivation and example
> ===
> Adding or removing one or more queues to RSS actions cloned in multiple
> flow rules imposes per rule toll for current DPDK flow API; the scenario
> requires for each flow sharing cloned RSS action:
> - call `rte_flow_destroy()`
> - call `rte_flow_create()` with modified RSS action
> 
> In order to prevent the overhead of multiple RSS flow rules reconfiguration
> API for in-place flow action modification introduced in this commit.

It seems there is an usability improvement with this new API.
If I understand well, the main motivation is to improve the performance?
The PMD implementation should try to keep a shared object
to benefit of the performance improvement, right?


The existing rte_flow API functions are:
        rte_flow_validate()
        rte_flow_create()
        rte_flow_destroy()
        rte_flow_flush()
        rte_flow_query()
        rte_flow_isolate()
        rte_flow_get_aged_flows()

> +     # added in 20.08
> +     rte_flow_action_ctx_create;
> +     rte_flow_action_ctx_destoy;
> +     rte_flow_action_ctx_modify;
> +     rte_flow_action_ctx_query;

We had "create", "destroy", "query", but no "modify" capability.
The new API is adding 2 things in my opinion:
        - shared action object
        - "modify" capability (is "update" a better wording?)

About the wording, do we need "ctx"?
I feel rte_flow_action is a good enough prefix for this API,
and should be documented as a shared action object.
I think the word "object" is more meaningful than "context".
Am I missing something?


> +     /**
> +      * Describes action context.
> +      *
> +      * Enables multiple rules reference the same action by id/ctx.
> +      *
> +      * No action specific struct here (void*) since it can be any
> +      * action type.
> +      */
> +     RTE_FLOW_ACTION_TYPE_CTX,

Why do we need a new action type?


> @@ -101,6 +101,28 @@ struct rte_flow_ops {
> +     /** See rte_flow_action_ctx_destoy() */
> +     void *(*action_ctx_create)
> +             (struct rte_eth_dev *dev,
> +             const struct rte_flow_action *action,
> +             struct rte_flow_error *error);
> +     /** See rte_flow_action_ctx_create() */
> +     int (*action_ctx_destroy)
> +             (struct rte_eth_dev *dev,
> +             void *ctx,
> +             struct rte_flow_error *error);
> +     /** See rte_flow_action_ctx_modify() */
> +     int (*action_ctx_modify)
> +             (struct rte_eth_dev *dev,
> +             void *ctx,
> +             const void *action_conf,
> +             struct rte_flow_error *error);
> +     /** See rte_flow_action_ctx_query() */
> +     int (*action_ctx_query)
> +             (struct rte_eth_dev *dev,
> +             const void *ctx,
> +             void *data,
> +             struct rte_flow_error *error);

API functions are directly linked to PMD ops, it looks simple and good.


Reply via email to